回文的定义:
正读和反读都相同的字符序列为“回文”,如“abcba”、“abcccba”是“回文”,“abcdea”和“ababab”则不是“回文”,也大体指具有对称性的。字符串的最长回文子串,是指一个字符串中包含的最长的回文子串。例如“1212134”的最长回文子串是“12121”。
由上面我们理解到回文的定义后,我们可以来分析用啥算法来解决这个问题:
- 假设只有一个变量则一定是回文字符串;
- 假设有两个字符的字符串,只有两个相等才是回文字符串;
- 如果假设字符串>3,假设有变量i,j。让其“i”指向一个字符串的开头,“j”指向尾部的元素;如果用f[i][j] 保存子串从i 到j是否是回文子串,那么在求f[i][j] 的时候如果j-i>=2时,如果 f[i][j] 为回文,那么f[i+1][j-1],也一定为回文。否则f[i][j]不为回文
package leetcode;
/**
* @author 江河
* @date 2019-07-07 20:25
*/
public class LongString5 {
public static void main(String[] args) {
String s="abcccab";
String str=longestPalindrome(s);
System.out.println(str);
}
public static String longestPalindrome(String s) {
if (s == null || s.length() == 0) {
return s;
}
//字符串转为字符数组
// str = s.toCharArray();
String str = "";
int maxLen = 0;
//定义一个数组长度
boolean[][] dp = new boolean[s.length()][s.length()];
for (int j = 0; j < s.length(); j++) {
//一个元素肯定是回文串
for (int i = 0; i <= j; i++) {
//如果str[i]==str[j]在递归i+1与j-1比较的前提条件是j-i<2
dp[i][j] = s.charAt(i) == s.charAt(j) && ((j-i<=2) || dp[i + 1][j - 1]);
if (dp[i][j]) {
if (j - i + 1 > maxLen) {
maxLen = j - i + 1;
str = s.substring(i, j + 1);
}
}
}
}
return str;
}
}