一、题意
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
二、解法
解法:
动态规划
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]代表了i到j最长回文子序列的长度,
s[i]==s[j]:
d
p
[
i
]
[
j
]
=
d
p
[
i
+
1
]
[
j
−
1
]
+
2
dp[i][j]=dp[i+1][j-1]+2
dp[i][j]=dp[i+1][j−1]+2
s[i]!=s[j]:
d
p
[
i
]
[
j
]
=
m
a
x
(
d
p
[
i
+
1
]
[
j
]
,
d
p
[
i
]
[
j
−
1
]
)
dp[i][j]=max(dp[i+1][j],dp[i][j-1])
dp[i][j]=max(dp[i+1][j],dp[i][j−1])
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
三、代码
解法:
int longestPalindromeSubseq(string s) {
int n=s.length();
vector<vector<int>> dp(n,vector<int>(n,0));
for(int i=0;i<n;i++){
dp[i][i]=1;
}
int begin = 0;
int maxLen = 1;
for(int i=n-2;i>=0;i--){
for(int j=i+1;j<n;j++){
if(s[i]==s[j]){
dp[i][j]=dp[i+1][j-1]+2;
}
else{
dp[i][j] = max(dp[i+1][j],dp[i][j-1]);
}
}
}
return dp[0][n-1];
}
四、总结
五、引用
[1] leetcode:516. Longest Palindromic Subsequence
[2] leetcode:516. Longest Palindromic Subsequence官方解法