LeetCode 1930. Unique Length-3 Palindromic Subsequences

🔗 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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值