🔗 https://leetcode.com/problems/unique-length-3-palindromic-subsequences
题目
- 给一个由 lowercase english letter 组成的字符串
- 返回其中长度为 3 的回文 subsequence 的个数,重复的记一次
- subsequnce 是子序列,不需要连续,但是不能改变字符的相对顺序
思路
- prefix sum 需要记录 26 个字符的出现次数
- 顺序遍历 string,判断当前 ch 是否之前出现过,若没有出现过,continue
- 若出现过,判断出现过几次,若超过 1 次,则表示 ch ch ch 组成的字符串是一个回文,统计之前进行去重判断
- 用当前的 26 个字符出现次数统计 curr,和最后一次出现 ch 时候的字符频次统计进行比较 freq,若有多出来频次的字符且没有统计过,计数 + 1
代码
class Solution {
public:
int countPalindromicSubsequence(string s) {
int count = 0;
unordered_set<char> sub[26];
unordered_map<char, int> curr;
unordered_map<char, int> freq[26];
for (int i = 0; i < s.size(); i++) {
char ch = s[i];
curr[ch]++;
if (freq[ch - 'a'].size() == 0) {
freq[ch - 'a'] = curr;
continue;
}
if (freq[ch - 'a'][ch] > 1) {
if (sub[ch - 'a'].count(ch) == 0) {
sub[ch - 'a'].insert(ch);
count++;
//printf("%c%c%c\n", ch, ch, ch);
}
}
if (sub[ch - 'a'].size() == 26)
continue;
for (int j = 0; j < 26; j++) {
if (freq[ch - 'a'][j + 'a'] == curr[j + 'a'])
continue;
if (ch == j + 'a') continue;
if (sub[ch - 'a'].count(j + 'a'))
continue;
sub[ch - 'a'].insert(j + 'a');
count++;
//printf("%c%c%c\n", ch, j + 'a', ch);
}
freq[ch - 'a'] = curr;
}
return count;
}
};