/**
* https://leetcode-cn.com/problems/longest-palindromic-substring/
*首先建立一个二维布尔类型的表,默认值都是false
*由于一个字符本身就是回文,所以二维表的对角线上都true
*/
public class _5_最长回文子串 {
public static void main(String[] args) {
_5_最长回文子串 w = new _5_最长回文子串();
System.out.println(w.longestPalindrome("babab"));
}
public String longestPalindrome(String s) {
int length = s.length();
int maxlen = 1;
int begin = 0;
boolean[][] df = new boolean[length][length];
for (int i = 0; i < length; i++) {
df[i][i] = true;
}
char[] chars = s.toCharArray();//将字符s转化为字符数组
for (int j = 1; j < length; j++) {
for (int i = 0; i < j; i++) {
if (chars[i] != chars[j]) {
df[i][j] = false;
} else {
if (j - i < 3) {//如果chars[i] == chars[j],并且j - i < 3,也就是中间有两个,或者三个元素,aa,aba
df[i][j] = true;
} else {//如果有多个元素,则要看左下角,也就是上一个串是不是回文串,例如babab,b=b,看aba是不是回文串
df[i][j] = df[i + 1][j - 1];
}
}
// 只要 dp[i][j] == true 成立,就表示子串 s[i..j] 是回文,此时记录回文长度和起始位置
if (df[i][j] && j - i + 1 > maxlen) {
System.out.println("J" + j + "I" + i);
maxlen = j - i + 1;
begin = i;
}
}
}
for (int i = 0; i < length; i++)
System.out.println(Arrays.toString(df[i]));
return s.substring(begin, begin + maxlen);
}
}
_5_最长回文子串
最新推荐文章于 2023-03-24 13:24:12 发布