首页 > 编程知识 正文

最长回文子串Java,回文串是什么意思

时间:2023-05-03 12:39:53 阅读:32895 作者:2391

文章目录解决方案1 -动态规划解决方案2 -中心扩展解决方案3 -中心扩展优化解决方案4-mana cher

解决方案1 -动态规划

dp[i][j]表示s[i,j]是否为回文串; 注意如果单个字符一定是回文串,则在dp表的对角线上,在s的长度为2以下的情况下,可以预先填写s是否是回文串,s[i]和s[j]是否相等s的长度为2以上的情况下,在方向,即s[i] char[] cs=s.toCharArray (; boolean [ ] [ ] DP=new boolean [ cs.length ] [ cs.length ]; //最长回文子串的长度int maxLen=1; //最长回文子串的开始索引int begin=0; //从下向上,I是s的起始索引,j是s的最右边索引for(intI=cs.Length-1; i=0; (I---- ) ) /从左向右for ) intj=I; j cs.length; j({intlen=j-I1; DP[I][j]=(cs[I]==cs[j] ) len=2 || dp[i 1][j - 1] ); if(DP[I][j]lenmaxlen ) ) { //cs[i][j]是回文子串maxLen=len; 比根=I; } }返回新字符串(cs、begin、maxLen ); 解决方案2 -中心扩展

这里主要区分奇数回文和偶数回文; 如果只以字符为中心,则记录的回文串一定是奇数,因此只要考虑以字符间隔为中心开始,将左右扫描扫描策略的字符变更为cur,cur 1就会变更为cur-1,cur1{if(s==null ) returur 1 if(s.length )=1)返回s; char[] cs=s.toCharArray (; for(intI=cs.Length-2; i=1; (I ) ) /防止数组越界(/以文字为中心左右扩展奇数的intlen1=palindromelength(cs,i - 1,i 1 ) )//以文字右侧的间隙为中心偶数的intlen2=palindrome length len1=math.max(len1,len2); if(len1Maxlen ) { maxLen=len1; Begin=I-((Maxlen-1 )1); } } //0位置右侧以间隙为中心的最长回文子串为最长2if(cs[0]==cs[1]Maxlen2) ) { begin=0; maxLen=2; }返回新字符串(cs、begin、maxLen ); }私密性privateintpalindromelength (char [ ] cs,int l,int r ) ) while(L=0rcs.lengthcs(L )==cs[R] ) L-; r; }返回r-l-1; }解决方案3 -中心扩展优化

利用回文的对称性。 相等的字符串一定是回文。 即,将整个相等的子串看作一个回文整体的2位置的b,可以找到与最初的其他不相等的文字。 如果将5个位置的a逐一往右找,3个位置的b是左边2个位置的b和5个位置的a,他们已经不相等了,所以3b的最大回文子串的长度不会超过2b int i=0。 wile(Ics.Length ) { int l=i - 1; int r=i; wile(rcs.Lengthcs[r]==cs[I]; i=r; wile (l=0RCS.length cs [ l ]==cs [ r ] (l---- ); r; //扩展结束后,在找到cs[l 1,R]的最大回文子串// l之后,l为开始索引int len=r - l; if(LenMaxlen ) ) { maxLen=len; begin=l; } }解决方案4-mana cher

类解决方案{ publicstringlongestpalindrome (strings ) if ) s==null )返回空值; if(s.length )=1)返回s; char[] oldCs=s.toCharArray (; //最长回文子串的长度int maxLen=0; //预处理char[]cs=preprocess(Oldcs ); //m序列int[] m=new int[cs.length]; int c=1,r=1,lastIdx=m.length - 2; int idx=0; for(intI=2; i lastIdx; I ) )/m数组首尾必须没有回文子串if(rI ) /,以c为中心的最长回文子串具有对称性intLi=(c1 )- i; 以//c为中心的最长回文子串的周起始索引m[i]=(i m[li]=r )? m[li] : r - i; 以//I为中心的回文子串的右索引,在r的左边为m[li],至少以}//I为中心,左右为while(cs(I ) I )1)==cs(I-m ) I )-1 ) ) m ) 如果可以//扩展,更新m[I]//c,r,右if(Im[I]r ) ) c=I,以增大回文对称区域; r=i m[i]; (if ) m[I]Maxlen ) ) { maxLen=m[i]; idx=i; }intbegin=(idx-maxlen ) 1; 返回新字符串(oldcs、begin、maxLen ); } private char [ ] preprocess [ ] oldcs ] { char [ ] cs=new char [ ] oldcs.length1]3}; cs[0]='^ '; cs[1]='# '; cs[cs.length - 1]='$ '; for(intI=0; i oldCs.length; I ) {intidx=(I1 ) 1; cs[idx]=oldCs[i]; cs[idx 1]='# '; }返回Cs; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。