Leetcode647:
问题描述:
给你一个字符串 s
,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
示例 1:
输入:s = "abc" 输出:3 解释:三个回文子串: "a", "b", "c"
示例 2:
输入:s = "aaa" 输出:6 解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
提示:
1 <= s.length <= 1000
s
由小写英文字母组成
代码及注释:
class Solution {
public:
int countSubstrings(string s) {
//枚举所有的连续子串
int n=s.size();
int ans=0;
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
if(iskey(s,i,j))ans++;
}
}
return ans;
}
bool iskey(string& s,int i,int j){
while(i<j){
if(s[i]!=s[j])return false;
i++;j--;
}
return true;
}
};
Leetcode516:
问题描述:
给你一个字符串 s
,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
输入:s = "bbbab" 输出:4 解释:一个可能的最长回文子序列为 "bbbb" 。
示例 2:
输入:s = "cbbd" 输出:2 解释:一个可能的最长回文子序列为 "bb" 。
提示:
1 <= s.length <= 1000
s
仅由小写英文字母组成
代码及注释:
class Solution {
public:
//dp[i][j]代表 s[i,j]最长回文子序列的长度
// s[i]==s[j] dp[i][j]=dp[i+1][j-1]+2;
// s[i]!=s[j] dp[i][j]=max(dp[i+1][j],dp[i][j-1])
int dp[1005][1005];
int longestPalindromeSubseq(string s) {
int n=s.size();
for(int i=n-1;i>=0;i--){
dp[i][i]=1;
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];
}
};