给你一个字符串 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;
}
};