Leetcode周赛:长度为 3 的不同回文子序列

给你一个字符串 s ,返回 s 中 长度为 3 的不同回文子序列 的个数。

即便存在多种方法来构建相同的子序列,但相同的子序列只计数一次。

回文 是正着读和反着读一样的字符串。

子序列 是由原字符串删除其中部分字符(也可以不删除)且不改变剩余字符之间相对顺序形成的一个新字符串。

例如,"ace" 是 "abcde" 的一个子序列。

思路

长度为3的回文子序列,那么只要这个序列的首尾两个字母相同,中间可以填充任意字母。因此问题分解为:找到两个相同的字母、再找出两个字母之间不同字母的数量。

方法

  • 由于首尾字母相同的子序列只算作一个,所以考虑遍历可能的26个字母;
  • 定位这两个相同的字母则需要通过双指针分别从字符串的首尾遍历,以保证最大范围;
  • 利用哈希表来统计两个相同字符之间不同字母的数量。

代码如下:

class Solution {
public:
    int countPalindromicSubsequence(string s) {
        int res = 0;
        for(int cha = 'a'; cha <= 'z'; cha++)
        {
            int left = 0;
            int right = s.length()-1;
            vector<int> diffChar(26, 0);
            while(s[left] != cha && left < right)
            {
                left++;
            }
            while(s[right] != cha && left < right)
            {
                right--;
            }
            for(int index = left+1; index < right; index++)
            {
                if(diffChar[s[index] - 'a'] == 0)
                {
                    res++;
                }
                diffChar[s[index] - 'a']++;
            }
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值