【刷题】最长回文子串-动态规划
最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
示例一
输入:s = “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。
示例二
输入:s = “cbbd” 输出:“bb”
思路:
-
创建动态规划数组dp,初始化其中dp[i][i]=true 字符串长度为1一定是回文串,长度为2时只有两个字符相同才是回文串 如果下标从i到j的子串是回文子串,那么i和j下标对应的字符一定相同(s[i]==s[j]),并且下标i+1到j-1的子串也一定是回文子串。 if(s[i]!=s[j]),那么子串s(i:j)不是回文子串,dp[i][j]=false; if(s[i]==s[j]).dp[i][j]=dp[i+1][j-1],其中要保证i+1<=j-1;
public String longestPalindrome(String s) { int length=s.length(); if(length==1)return s; int maxlen=1; int begin=0; String res; boolean[][] dp = new boolean[length][length]; for(int i=0;i<length;i++){ dp[i][i]=true; } char[] getString = s.toCharArray(); for (int L = 1; L <length ; L++) { for(int i=0;i<length;i++){ int j=L+i; if(j>=length)break; if(getString[i]!=getString[j]) dp[i][j]=false; else{ if(i+1<=j-1){ dp[i][j]=dp[i+1][j-1]; }else{ dp[i][j]=true; } } if(dp[i][j]&&j-i+1>maxlen){ maxlen=j-i+1; begin=i; } } } return s.substring(begin,begin+maxlen); }
上一篇:
通过多线程提高代码的执行效率例子