最长回文子串
框图详解,动态规划
public int getLongestPalindrome(String A, int n) {
//边界条件判断
if (n < 2)
return A.length();
//start表示最长回文串开始的位置,
//maxLen表示最长回文串的长度
int maxLen = 1;
boolean[][] dp = new boolean[n][n];
for (int right = 1; right < n; right++) {
for (int left = 0; left <= right; left++) {
//如果两种字符不相同,肯定不能构成回文子串
if (A.charAt(left) != A.charAt(right))
continue;
//下面是s.charAt(left)和s.charAt(right)两个
//字符相同情况下的判断
//如果只有一个字符,肯定是回文子串
if (right == left) {
dp[left][right] = true;
} else if (right - left <= 2) {
//类似于"aa"和"aba",也是回文子串
dp[left][right] = true;
} else {
//类似于"a******a",要判断他是否是回文子串,只需要
//判断"******"是否是回文子串即可
dp[left][right] = dp[left + 1][right - 1];
}
//如果字符串从left到right是回文子串,只需要保存最长的即可
if (dp[left][right] && right - left + 1 > maxLen) {
maxLen = right - left + 1;
}
}
}
//最长的回文子串
return maxLen;
}
根据画图,来详细介绍动态规划的思想
其实牛客网上字段文字已经很清楚了,但是我们还是借助表格画图来进行推理一下。
我们以“abbba”这个字符串来进行画表格
第一步看懂表格
横排:为Java代码中的right边界;竖排:为Java代码中的left边界
第一层for循环,设置右边界,第二层for循环,依次从左开始遍历,不断向右边界靠近
填表格
当str.charAt(left)==str.charAt(right)的时候,此时要分三种情况
第一种情况:
由于left和right之间的下标差距不大于1,那么str.charAt(left)==str.charAt(right)就认为是回文子串,例如“aa”
第二种情况
注意绿色框,此时str.charAt(left)==str.charAt(right),但是两个b的下标之差等于2,说明中间隔了一个字符,当时这种情况,依旧可以直接判断为回文子串,例如:“bab”或者“bbb”
第三种情况
当str.charAt(left)==str.charAt(right),例如此时,left=0,right=4,两者之间的距离大于2,表格中位置为(0,4)上的位置还不能直接填写true,不能直接判断是否是子字符串,那么我们就应该将两个下标分别+1,-1,使得左右相向走一步。就变成了left=1,right=3,但是这种情况在表格中,已经出现,就是我箭头所指向的地方,在之前我们已经做了判断,所以直接返回true,认为 left=0,right=4 对应的情况满足回文子串,此时再填写true。
最后就是不断地查找,替换最长长度。就可以了。
这道题是一道简单的动态规划题。