軟件開發(fā)模型及其特點優(yōu)化神馬網(wǎng)站關(guān)鍵詞排名價格
# 力扣第47天— 第647題、第516題
文章目錄
- 一、第647題--回文子串
- 二、第516題--最長回文子序列
一、第647題–回文子串
? 邏輯梳理清楚了,就還行。沒有想象中那么難。注意遍歷順序,i從大到小。
class Solution {
public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result = 0;for (int i = s.size()-1; i>=0; i--){for (int j = i; j<= s.size()-1; j++){if(s[i] == s[j]) {if (j-i <=1) {dp[i][j] = true;result++;}else {dp[i][j] = dp[i+1][j-1];if (dp[i][j]) result++;}}}}return result;}
};
二、第516題–最長回文子序列
? 還可以吧,跟上一題差不多。遍歷順序一樣,但是要注意,j的遍歷起點為i+1,因為遞歸的時候涉及到i+1,會導(dǎo)致越界。遞推公式,要想一想,但是難度不大。
class Solution {
public:int longestPalindromeSubseq(string s) {vector<vector<int>> dp(s.size(), vector<int>(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++){// cout << dp[i][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];}
};