day57 动规.p17 子序列

- 647. 回文子串  
```cpp
class Solution {
public:
    int extend(const string& s, int left, int right, int len) {
        int count = 0;
        while (left >= 0 && right < len && s[left] == s[right]) {
            count++;
            left--;
            right++;
        }
        return count;
    }
    
    int countSubstrings(string s) {
        int result = 0;
        for (int i = 0; i < s.size(); i++) {
            // 以单个字母为中心
            result += extend(s, i, i, s.size());
            // 以两个字母为中心
            result += extend(s, i, i + 1, s.size());
        }
        return result;
    }
};
```

- 516.最长回文子序列
```cpp
class Solution {
public:
    int longestPalindromeSubseq(string s) {
        vector> dp(s.size(), vector(s.size(), 0));
        // 自己就是一个子串
        for (int i = 0; i < s.size(); i++) dp[i][i] = 1;

        for (int i = s.size() - 1; i >= 0; i--) {
            for (int j = i + 1; j < s.size(); 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][s.size() - 1];
    }
};
```
 

你可能感兴趣的:(leetcode,c++)