5.最长回文子串class Solution { public: /* int sumRemainder(string a) { int sum = 0; for (int i = 0; i < a.length(); i++) sum = (sum + a[i]) % 123; return sum; } bool judge(string a) { for (int len = a.length() / 2; len >= 1; len /= 2) for (int i = 0; i < a.length() / 2 / len; i++) if (sumRemainder(a.substr(0 + i * len, len)) != sumRemainder(a.substr(a.length() - (i + 1) * len, len))) return 0; return 1; } string longestPalindrome(string s) { string ans; for (int start = 0; start < s.length(); start++) for (int len = 2; len <= s.length() - start; len++) if (judge(s.substr(start, len)) && len > ans.length()) ans = s.substr(start, len); return ans.empty() ? s.substr(0, 1) : ans; } //比一个一个找更慢 */ /* string longestPalindrome(string s) { string s1 = s; reverse(s1.begin(), s1.end()); int Max = 0; int pos = 0; for (int begin = 1 - (int)s.size(); begin < (int)s.size(); begin++) { int thisMax = 0; int thisPos = 0; for (int i = max(0, begin), j = max(0, -begin); i < s.size() && j < s.size(); i++, j++) { if (s[i] != s1[j]) { thisMax = 0; } else { thisMax++; thisPos = i; if (thisMax > Max) { Max = thisMax; pos = thisPos; } } } } return s.substr(pos - Max + 1, Max); } //!例外:"aacabdkacaa" */ string longestPalindrome(string s) { int size = s.size(); vector<vector<bool>> dp(size, vector<bool>(size, 0)); int pos = 0; int Max = 1; for (int i = size - 1; i >= 0; i--) for (int j = i; j < size; j++) if (j == i) dp[i][j] = 1; else if (s[j] == s[i]) if (j == i + 1) { dp[i][j] = 1; if (j - i + 1 > Max) { Max = j - i + 1; pos = i; } } else if (dp[i + 1][j - 1]) { dp[i][j] = 1; if (j - i + 1 > Max) { Max = j - i + 1; pos = i; } } else dp[i][j] = 0; else dp[i][j] = 0; return s.substr(pos, Max); // 180/180 cases passed (372 ms) // Your runtime beats 37.88 % of cpp submissions // Your memory usage beats 53.29 % of cpp submissions (29.3 MB) //*原理如下 // babad // 10100 // 1010 // 100 // 10 // 1 //双指针法更好 }}; 413.等差数列划分class Solution { public: int numberOfArithmeticSlices(vector<int> &nums) { if (nums.size() < 3) return 0; int sum = 0; /* vector<vector<bool>> dp(nums.size(), vector<bool>(nums.size(), 0)); for (int i = nums.size() - 3; i >= 0; i--) { for (int j = i + 2; j < nums.size(); j++) { if (j == i + 2 && nums[j] + nums[i] == 2 * nums[j - 1]) { dp[i][j] = 1; sum++; } else if (dp[i][j - 1] == 1 && dp[i + 1][j] == 1) { dp[i][j] = 1; sum++; } } } return sum; // 15/15 cases passed (76 ms) // Your runtime beats 46.53 % of cpp submissions // Your memory usage beats 5.07 % of cpp submissions (11.8 MB) */ vector<int> dp(nums.size(), 0); for (int i = nums.size() - 3; i >= 0; i--) { if (nums[i] + nums[i + 2] == 2 * nums[i + 1]) { dp[i] = dp[i + 1] + 1; sum += dp[i]; } } return sum; // 15/15 cases passed (4 ms) // Your runtime beats 46.53 % of cpp submissions // Your memory usage beats 91 % of cpp submissions (7 MB) }}; 91.解码方法class Solution { public: int numDecodings(string s) { if (s[0] == '0') return 0; vector<int> dp(s.size(), 0); dp[s.size() - 1] = 1; for (int i = s.size() - 2; i >= 0; i--) { if (s[i] == '0') { if (s[i + 1] == '0') return 0; else dp[i] = dp[i + 1]; } else if (s[i] == '1') { if (s[i + 1] == '0' || s[i + 2] == '0') dp[i] = dp[i + 1]; else dp[i] = dp[i + 1] + (i + 2 > s.size() - 1 ? 1 : dp[i + 2]); } else if (s[i] == '2') { if (s[i + 1] == '0' || s[i + 1] > '6' || s[i + 2] == '0') dp[i] = dp[i + 1]; else dp[i] = dp[i + 1] + (i + 2 > s.size() - 1 ? 1 : dp[i + 2]); } else { if (s[i + 1] == '0') return 0; else dp[i] = dp[i + 1]; } } return dp[0]; // 269/269 cases passed (0 ms) // Your runtime beats 100 % of cpp submissions // Your memory usage beats 67.34 % of cpp submissions (6 MB) /* *1123 ?1235(3=2+1)(5=3+2) */ }}; 139.单词拆分#include <unordered_set>//TODO: 是不是应该抽点时间熟悉一下c++的容器class Solution { public: bool wordBreak(string s, vector<string> &wordDict) { /* if (s.empty()) return 1; bool ans = 0; for (int j = 0; j < wordDict.size(); j++) { if (s.size() >= wordDict[j].size() && s.substr(0, wordDict[j].size()) == wordDict[j]) { cout << s.substr(wordDict[j].size()) << endl; ans = ans || wordBreak(s.substr(wordDict[j].size()), wordDict); } } return ans; //超时 */ vector<bool> dp(s.size() + 1, false); // dp[i]表示字符串s的前i个字符能否拆分成wordDict。 unordered_set<string> m(wordDict.begin(), wordDict.end()); dp[0] = true; //获取最长字符串长度 int maxWordLength = 0; for (int i = 0; i < wordDict.size(); i++) { maxWordLength = max(maxWordLength, (int)wordDict[i].size()); } for (int i = 1; i <= s.size(); ++i) { for (int j = max(i - maxWordLength, 0); j < i; ++j) { if (dp[j] && m.find(s.substr(j, i - j)) != m.end()) { dp[i] = true; break; } } } return dp[s.size()]; // 45/45 cases passed (0 ms) // Your runtime beats 100 % of cpp submissions // Your memory usage beats 83.55 % of cpp submissions (7.5 MB) //利用unordered_set实现快速查找 }};