JAVA:返回字符串中最长回文子串的长度
2017-04-11 16:30
337 查看
举例:
String str=”asdfg”, 最长回文子串是”a”,”s”,”d”,”f”,”g”,返回长度是1
String str=”asdsa”,最长回文子串是”asdsa”,返回长度是5
1. 暴力解决(代码超短)
时间复杂度是o(n*n)
2. Manacher算法(效率超高)
时间复杂度是o(n)
String str=”asdfg”, 最长回文子串是”a”,”s”,”d”,”f”,”g”,返回长度是1
String str=”asdsa”,最长回文子串是”asdsa”,返回长度是5
1. 暴力解决(代码超短)
时间复杂度是o(n*n)
public static int getMaxLength(String str){ //字串长度由length()递减,直到字串符合回文串定义位置,即可返回 if(str==null||str.length()==0) return 0; for(int i=str.length();i>=0;i--){ for(int j=0;j+i<=str.length();j++){ if(str.substring(j, j+i).equals(new StringBuffer(str.substring(j, j+i)).reverse().toString()))//判断是否是回文串 return i; } } return 0; }
2. Manacher算法(效率超高)
时间复杂度是o(n)
public static int maxLength(String str){ if(str==null||str.length()==0) return 0; char []charArr=manacherString(str);//加字符 int []pArr=new int[charArr.length];//回文半径 int pR=-1;//当前位置的最大回文半径+1 int index=-1;//之前圆心 int max=Integer.MIN_VALUE; for(int i=0;i<charArr.length;i++){ pArr[i]=pR>i?Math.min(pArr[2*index-i], pR-i):1; while(i+pArr[i]<charArr.length&&i-pArr[i]>=0){//扩半径 if(charArr[i-pArr[i]]==charArr[i+pArr[i]]) pArr[i]++; else break; } if(pArr[i]+i>pR){ pR=pArr[i]+i; index=i; } max=Math.max(pArr[i], max); } return max-1; } public static char [] manacherString(String str){ //填充字符“#” char []charArr=new char[str.length()*2+1]; for(int i=0;i<str.length();i++){ charArr[2*i]='#'; charArr[2*i+1]=str.charAt(i); } charArr[charArr.length-1]='#'; return charArr; } 举例: asddfsdffd #a#s#d#d#f#s#d#f#f#d#
相关文章推荐
- 给出两个字符串,找到最长公共子串,并返回其长度,java实现
- 回文串是指这个字符串无论从左读还是从右读,所读的顺序是一样的;简而言之,回文串是左右对称的。现在,对于一个给定的母串 abcdedcb求最长回文子串的长度
- 对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
- 给定一个字符串,求它的最长回文子串的长度,并打印出最长回文子串
- 字符串中找出连续最长的数字子串,并返回这个数字串的长度
- 面试题:最长回文子串(即求对称字符串的最大长度 )
- 求一个字符串中最长回文子串的长度(承接上一个题目)
- C语言 求一个字符串中最长回文子串的长度
- 20170827_从字符串中返回最长的回文子串
- 给定一个字符串s,找出s中最长的回文子串,你可以假设s的最大长度是1000。
- 对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
- JAVA代码—算法基础:给定一个字符串查找最长回文子串
- 给定一个字符串,返回字符串中没有重复字符的最长子串的长度
- 求一字符串最长不重复字符子串的长度【Java 版】
- POJ3974 求字符串的最长回文子串的长度
- 求字符串中的最长回文子串的长度
- 字符串系列之最长回文子串
- 计算一个字符串中最大的子串的长度,并将它返回。如“abc12345sdfsasdfsd”最大的子串是sdfsasdfsd
- 找出字符串中对称的子字符串的最大长度(最长回文)
- 在字符串中找出连续最长的数字串并以参数形式返回,并把这个串的长度返回