今日题目

https://leetcode.com/problems/unique-length-3-palindromic-subsequences/description/

思路

由于题目要求的是不同子序列的数量,因此最大计数为 $26*26 = 676$。所以我们只需要统计两个相同字符之间有多少个不同的字符即可。

方法

首先计算每个字符首次和最后一次出现的位置,然后在 l 和 r 之间遍历,统计其中有多少个不同的字符。

复杂度

  • 时间复杂度:$O(kN)$,k 为不同字符的数量,此处为 26 个不同字母,N 为字符串长度。

  • 空间复杂度:$O(N)$

代码

class Solution:
    def countPalindromicSubsequence(self, s: str) -> int:
        st = [inf] * 26
        en = [-1] * 26
        a = ord('a')
        for i,ch in enumerate(s):
            nch = ord(ch) - a
            st[nch] = min(st[nch], i)
            en[nch] = max(en[nch], i)

        ans = 0

        for x in range(26):
            if en[x] <= st[x]:
                continue
            # print(en[x], st[x], x)
            vis = set([])
            for i in range(st[x] + 1, en[x]):
                vis.add(s[i])
            ans += len(vis)

        return ans