题目出处:https://leetcode-cn.com/problems/unique-length-3-palindromic-subsequences/
思路:用vector<vector>记录每个字符出现的位置。对于ABA,枚举A和B即可。如果A出现的次数大于2,则在A第一次出现的位置和最后一个出现的位置中查找B出现的次数,用二分查找实现。
class Solution {
public:
int countPalindromicSubsequence(string s) {
int n = s.length();
vector<vector<int>> pos(26);
for(int i = 0; i < s.length(); ++i){
pos[s[i]-'a'].push_back(i); //每个字符出现的顺序
}
int ans = 0;
for(int i = 0; i < 26; ++i){
if(pos[i].size() >= 2){
int l = pos[i][0], r = pos[i].back();
for(int j = 0; j < 26; ++j){
auto it = upper_bound(pos[j].begin(), pos[j].end(), l);
if(it != pos[j].end() && *it < r){
++ans;
}
}
}
}
return ans;
}
};