回文子串和回文子序列的异同
秋水 Lv4

回文子串

给你一个字符串 s,找到 s 中最长的回文子串

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

1
2
3
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

1
2
输入:s = "cbbd"
输出:"bb"

答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package huiwen;

public class longestPalindrome {
public String longestPalindromeSolve(String s) {
int len = s.length();
if (len < 2){
return s;
}
int maxLen = 1;
int begin = 0;
//dp[i][j]表示从i到j是否为回文子串
boolean[][] dp = new boolean[len][len];
//初始化所有长度为1的子串都是回文串
for(int i = 0; i < len; i++){
dp[i][i] = true;
}

char[] charArray = s.toCharArray();
//递推开始
//枚举子串长度 L代表先找长度为2的
for (int L = 2 ; L <= len; L++){
for (int i = 0; i <= len - L; i++){
/*这里为什么i要小于len-L
* 因为 j-i = L -1 i从0开始
* j要小于len 所以 i+L-1 要小于len
* 即 i < len-L +1 或者 i<=len-L
* */
int j = L+i-1;
if (charArray[i] != charArray[j]){
dp[i][j] = false;
}else {
if (j-i<3){
//如果小于3 则只有 aba(首位i,j相同),a,aa的情况 都是回文子串
dp[i][j] = true;
}else {
dp[i][j] = dp[i+1][j-1];
}
}
//只要dp[i][L] == true 成立,则表示是回文
if (dp[i][j] && j-i+1 > maxLen){
maxLen = j-i+1;
begin = i;
}
}
}
return s.substring(begin,begin+maxLen);
}
}

回文子序列

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

示例 1:

1
2
3
输入:s = "bbbab"
输出:4
解释:一个可能的最长回文子序列为 "bbbb" 。

示例 2:

1
2
3
输入:s = "cbbd"
输出:2
解释:一个可能的最长回文子序列为 "bb" 。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public int longestPalindromeSubseq(String s){
int n = s.length();
int[][] dp = new int[n][n];
for (int i = 0; i < n; i++){
dp[i][i] =1;
}
//遍历所有可能的子序列
for (int len = 2; len <= n ; len++){
for (int i = 0; i <= n-len; i++){
int j = i+len-1;
char c1 = s.charAt(i), c2 =s.charAt(j);
if(c1 == c2){
dp[i][j] = dp[i+1][j-1]+2;
}else{
dp[i][j] = Math.max(dp[i][j-1],dp[i+1][j]);
}
}
}
return dp[0][n - 1];
}

两者区别地方

1
2
3
4
5
6
7
if(c1 == c2){
dp[i][j] = dp[i+1][j-1]+2;
}else{
dp[i][j] = Math.max(dp[i][j-1],dp[i+1][j]);

//回文子序列不需要判断之前是否为回文
//回文子串需要判断
  • Post title:回文子串和回文子序列的异同
  • Post author:秋水
  • Create time:2024-03-25 15:17:52
  • Post link:tai769.github.io2024/03/25/回文子串和回文子序列的异同/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.