classSolution { public: // 中心扩展, 分别以一个字符为中心、两个字符为中心。 共2n-1种可能 intcountSubstrings(string s){ int n = s.size(), ans = 0; // 默认一个字符的均为回文串 for (int i = 0; i < n; i++) { // 以一个字符为中心 int left = i, right = i; while (left >= 0 && right < n) { if (s[left--] == s[right++]) ans++; elsebreak; } } for (int i = 0; i < n - 1; i++) { // 以两个字符为中心 int left = i, right = i+1; while(left>=0 && right<n){ if(s[left--] == s[right++]) ans++; elsebreak; } } return ans; } };
精简
classSolution { public: intcountSubstrings(string s){ int n = s.size(), ans = 0; for (int i = 0; i < 2 * n - 1; ++i) { int l = i / 2, r = i / 2 + i % 2; while (l >= 0 && r < n && s[l] == s[r]) { --l; ++r; ++ans; } } return ans; } };
classSolution { public: //maxsize长度的字符串肯定包含minsize的字符串 //所以只需要统计最小长度的额字符串就可以 intmaxFreq(string s, int maxLetters, int minSize, int maxSize){ int n = s.size(); //暴力得到所有满足条件的字串 vector<string> all; for(int i = 0; i<n; i++){ //for(int j = minSize; j<=maxSize; j++){ if(i+minSize>n) continue; string temp = s.substr(i, minSize); //cout<<temp<<" "; all.push_back(temp); //} //cout<<endl; } unordered_map<string, int> mapp; int ans = 0; for(int i = 0; i<all.size(); i++){ unordered_set<int> sett; for(auto ch : all[i]){ sett.insert(ch); } if(sett.size() > maxLetters) continue; else mapp[all[i]]++; ans = max(ans, mapp[all[i]]); } return ans; } };
官方
classSolution { public: intmaxFreq(string s, int maxLetters, int minSize, int maxSize){ int n = s.size(); unordered_map<string, int> occ; int ans = 0; for (int i = 0; i < n - minSize + 1; ++i) { string cur = s.substr(i, minSize); unordered_set<char> exist(cur.begin(), cur.end()); if (exist.size() <= maxLetters) { string cur = s.substr(i, minSize); ++occ[cur]; ans = max(ans, occ[cur]); } } return ans; } };