给你一个字符串 s
,找到 s
中所有的回文子串。
1、动态规划法
public boolean[][] substrings(String s) {
int len = s.length();
boolean[][] isPal = new boolean[len][len];
for (int i = 0; i < len; i++) {
for (int j = 0; j <= i; j++) {
char ch1 = s.charAt(j);
char ch2 = s.charAt(i);
if (ch1 == ch2 && (i <= j + 1 || isPal[j + 1][i - 1])) {
isPal[j][i] = true;
}
}
}
return isPal;
}
如果字符串s[j...i]是回文子串,那么isPal[j][i]==true。上述代码的时间复杂度为O(n^2)。
2、中心拓展法
private int[] longestPalindromeHelper(String s, int i, int j) {
int n = s.length();
while (i >= 0 && j < n) {
if (s.charAt(i) != s.charAt(j)) break;
i--;
j++;
}
return new int[]{i + 1, j - 1};
}
其中的入参有两种情况:
(1)i = i ,j = i;
(2)i = i,j = i + 1;
分别代表从中心一个字符和两个字符进行拓展。
上述两种方法可以解决相当一部分力扣中有关回文子串的问题,其中第二个方法更快。