给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
第一遍的暴力搜索,961ms
class Solution {
char[] ch;
int n;
public String longestPalindrome(String s) {
ch=s.toCharArray();
n=ch.length;
String max="";
for(int i=0;i<n;i++){
for(int j=n-1;j>=i;j--){
String str=s.substring(i,j+1);
if(judge(i,j)==true && j+1-i>max.length()) {
max=str;
if(j+1-i==n) return s;//优化,如果原字符串就是回文那么直接返回。
}
}
}
return max;
}
boolean judge(int i,int j){
while(j>i){
if(ch[i]!=ch[j]) return false;
j--;
i++;
}
return true;
}
}
暴力搜索优化了一下,116ms,窗口滑行
class Solution {
char[] ch;
int n;
public String longestPalindrome(String s) {
ch=s.toCharArray();
n=ch.length;
String str="";
for(int i=n;i>=1;i--){//总长度
for(int j=0;j+i-1<=n-1;j++){//j滑行
if(judge(j,j+i-1)==true) {//只要找到一个就返回答案,第一个就是答案
return s.substring(j,j+i);
}
}
}
return str;
}
boolean judge(int i,int j){
while(j>i){
if(ch[i]!=ch[j]) return false;
j--;
i++;
}
return true;
}
}
采用求最长公共子串的方法,然后再判断一下。
class Solution {
public String longestPalindrome(String s) {
//最长公共子串,只不过要在最长公共字串上面修改一些代码
//比如"ccabdkacc"这样例子,不修改之前返回cca,改了之后返回cc
int n=s.length();
if(n<=1) return s;
int[][] dp=new int[n][n];
StringBuilder str=(new StringBuilder(s)).reverse();
char[] ch=str.toString().toCharArray();
int max=0,maxi=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(s.charAt(i)==ch[j]) {
if(i==0 || j==0) dp[i][j]=1;
else dp[i][j]=dp[i-1][j-1]+1;
}
if(dp[i][j]>max){
int temp=i-dp[i][j]+1;
if(n-1-temp==j){
max=dp[i][j];
maxi=i;
}
}
}
}
return s.substring(maxi-max+1,maxi+1);
}
}