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];}
};