题目:
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
思路:
1. 用指针i和指针j分别对应子串的开始位置和结束位置,使用矩阵来记录结果,则状态转移方程可以列为:
1) i==j, 为回文子串
2) i+1==j, 如果s[i+1]==s[j],则为回文子串
3)如果s[i]==s[j], 且result[i+1][j-1]为true, 则为回文子串
2. 遍历结果,找到最后最大子串
todo: 此解法不是最优,待看最优解法
代码:
class Solution {
public String longestPalindrome(String s) {
char[] a = s.toCharArray();
Integer[][] result = new Integer[s.length()][s.length()];
Boolean[][] hwRes = new Boolean[s.length()][s.length()];
fillForm(a, result, hwRes);
int max = 0;
String bigStr = "";
for (int i = 0; i < s.length(); i++) {
for (int j = i; j < s.length(); j++) {
if (result[i][j] != null && result[i][j] > max) {
max = result[i][j];
bigStr = s.substring(i, j + 1);
}
}
}
return bigStr;
}
public void fillForm(char[] s, Integer[][] result, Boolean[][] hwRes) {
for (int i = 0; i < s.length; i++) {
for (int j = i; j < s.length; j++) {
if (i == j) {
hwRes[i][j] = true;
result[i][j] = 1;
} else {
if (i + 1 == j) {
if (s[i] == s[j]) {
hwRes[i][j] = true;
result[i][j] = 2;
}
}
}
}
}
for (int i = 0; i < s.length; i++) {
for (int j = i; j < s.length; j++) {
if (j - i > 1) {
if (s[i] == s[j] && hwRes[i][j] == null) {
getChar(s, i, j, result, hwRes);
} else {
hwRes[i][j] = false;
}
}
}
}
}
public void getChar(char[] s, int i, int j, Integer[][] result, Boolean[][] hwRes) {
if (s[i] == s[j]) {
if (hwRes[i + 1][j - 1] == null) {
getChar(s, i + 1, j - 1, result, hwRes);
}
if (hwRes[i + 1][j - 1]) {
hwRes[i][j] = true;
result[i][j] = j - i + 1;
}
else {
hwRes[i][j] = false;
}
} else {
hwRes[i][j] = false;
}
}
}