版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32250495/article/details/89467358
给定一个字符串,查找该字符串中的最大回文子串。
如: "a" 最大回文子串为 "a" 大小为1
"aa" 最大回文子串为"aa" 大小为2
"aaa" 最大回文子串为"aaa" 大小为3
"aba" 最大回文子串为"aba" 大小为3
"character" 最大回文子串为"carac" 大小为5
该问题是一个动态规划问题。该问题的最优解,具有最优子结构性质,即该最优解可由子问题的最优解组合而成。
假定对于一个从i到j的字符串s[i,j],具有最优解 (a1,a2,...an)。如果去除a1, an,则最优子结构(a2,....an-1)是 s[i+1, j-1]的最优解。
下面要多考虑了, 回文串奇偶的问题:
下面只记录了最大的回文子串的大小,如果需要输出回文子串,需要增加一个备完数组记录该串。
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(System.in);
String str = null;
while((str=in.nextLine())!=null){
int [][] tt = new int[str.length()+1][str.length()+1];
char [] s = str.toCharArray();
for(int i = str.length()-1; i >= 0; i--){
for(int j = i; j <= str.length(); j++){
if(j==i) {
tt[i][j] = 0;
continue;
}
if((j-i)==1){
tt[i][j] = 1;
continue;
}
char a = s[i];
char b = s[j - 1];
if(a == b){
tt[i][j] = Math.max(tt[i][j-1] + 1, tt[i+1][j-1] + 2);
} else {
tt[i][j] = Math.max(tt[i][j-1], tt[i+1][j]);
}
}
}
System.out.println(tt[0][str.length()]);
}
}