首页 > 编程知识 正文

中考非连续性文本答题套路,回文算式规律

时间:2023-05-03 15:47:52 阅读:32960 作者:4295

最长回文子串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算法的具体算法说明

使用动态规划中心进行扩散

专门用于搜索最长回文字符串的算法

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