最长回文子串1 .暴力解法2 .动态规划3 .中心扩散法4.Manacher算法
leetcode 5.最长回文子串
视频参考了leetcode官方问题
示例:
字符串: babad
最长回文字符串: bab
1 .暴力解法时间复杂度o(n3 )、空间复杂度o ()1) ) )。
思路:我们通过遍历来进行枚举,通过找到最大程度对字符串进行裁切.
class解决方案{ publicstringlongestpalindrome (strings )//暴力解法int n=s.length ); if(N2 ) { return s; } int max_len=1; //最大长度int left=0; //左边距char[] c=s.toCharArray (; for(intI=0; 合1; I ) for(intj=I1; jn; j () if ) j-I1max_lenYanzheng(c,I,j ) ) { max_len=j-i 1; left=i; }}returns.substring(left,left max_len ); //回文字符串publicbooleanyanzheng(char ) c,int left,int right (while ) left right (if ) c ) left )!=c [ right ]; (} left; 光- -; }返回真; }2.动态规划dp[i][j]为回文子串时
dp[i 1][j-1]必须是回文子串
因此,动态转移方程3360 DP [ I ] [ j ]=DP [ i1 ] [ j-1 ] ^ (si==SJ )
边界条件:j-1-(I1 ) 12即j-i3即j-i 14
长度为2和3意味着可以不检查子字符串是否为回文
时间复杂度o(n2 )、空间复杂度o(n2 ) )。
例: abba是回文串bb必须是回文串,看两侧的要素是否相同
class解决方案{ publicstringlongestpalindrome (strings )//动态规划int n=s.length ); if(N2 ) { return s; } int max_len=1; //最大长度int left=0; //开始位置char[] c=s.toCharArray (; boolean[][] dp=new boolean[n][n]; //初始dp序列的对角线for(intI=0; in; I ) { dp[i][i]=true; //先填写,从左下角开始for(intj=1; jn; j ) for(intI=0; ij; I () if ) c[j]!=c[I]}{DP[I][j]=false; (else ) /边界条件if(j-I3 ) { dp[i][j]=true; }else{ dp[i][j]=dp[i 1][j-1]; }if(DP[I][j]j-I1max_len ) { max_len=j-i 1; left=i; }}returns.substring(left,left max_len ); }3.中心扩散法与合并序列的思想相似。
首先找到中心点,向周围扩散列举。
有必要考虑奇数和偶数的情况
奇数:中心为文字
偶数:中心是虚拟空间
时间复杂度o(n2 )空间复杂度o(n2) )。
class解决方案{ publicstringlongestpalindrome (strings )//中心扩散法int n=s.length ); if(N2 ) { return s; } int max_len=1; //最长距离int left=0; //开始下标char[] c=s.toCharArray (; //最后的位置不能再向右扩散了for(intI=0; 合1; I ) ) /偶数intou_len=center_expend(c,I,I ); //奇数intJi_len=center_expend(c,I,i 1); if(math.max(ou_len,ji_len ) max_len=math.max ) ou_len,ji_len ); left=I-(max_Len-1 )/2; //四舍五入}returns.substring(left,left max_len ); }公共int center _ expend (char [ ] c,int left,int right ) { //left为起始左边界//right为起始右边界//left==right时,返回文本int j=right; while(I=0jlen ) ) if ) c[I]==c[j] ) /扩散j; I----; }else{ break; () ) ) ) ) ) ) ) ) ) ) ) ) )跳出循环正好不等//len=j-I1- 2返回j-I-1; }} 4.Manacher算法的具体算法说明
使用动态规划中心进行扩散
专门用于搜索最长回文字符串的算法