动态规划-计数dp-2262. 字符串的总引力
2022-05-06 19:52:07
问题描述:
字符串的 引力 定义为:字符串中 不同 字符的数量。
- 例如,
"abbca"
的引力为3
,因为其中有3
个不同字符'a'
、'b'
和'c'
。
给你一个字符串 s
,返回 其所有子字符串的总引力 。
子字符串 定义为:字符串中的一个连续字符序列。
示例 1:
输入:s = "abbca" 输出:28 解释:"abbca" 的子字符串有: - 长度为 1 的子字符串:"a"、"b"、"b"、"c"、"a" 的引力分别为 1、1、1、1、1,总和为 5 。 - 长度为 2 的子字符串:"ab"、"bb"、"bc"、"ca" 的引力分别为 2、1、2、2 ,总和为 7 。 - 长度为 3 的子字符串:"abb"、"bbc"、"bca" 的引力分别为 2、2、3 ,总和为 7 。 - 长度为 4 的子字符串:"abbc"、"bbca" 的引力分别为 3、3 ,总和为 6 。 - 长度为 5 的子字符串:"abbca" 的引力为 3 ,总和为 3 。 引力总和为 5 + 7 + 7 + 6 + 3 = 28 。
示例 2:
输入:s = "code" 输出:20 解释:"code" 的子字符串有: - 长度为 1 的子字符串:"c"、"o"、"d"、"e" 的引力分别为 1、1、1、1 ,总和为 4 。 - 长度为 2 的子字符串:"co"、"od"、"de" 的引力分别为 2、2、2 ,总和为 6 。 - 长度为 3 的子字符串:"cod"、"ode" 的引力分别为 3、3 ,总和为 6 。 - 长度为 4 的子字符串:"code" 的引力为 4 ,总和为 4 。 引力总和为 4 + 6 + 6 + 4 = 20 。
提示:
1 <= s.length <= 105
s
由小写英文字母组成
问题求解:
典型的计数dp问题,考虑每个后缀的贡献即可。
class Solution: def appealSum(self, s: str) -> int: n = len(s) record = {} dp = [0] * n dp[0] = 1 record[s[0]] = 0 for i in range(1, n): idx = record.get(s[i], -1) if idx == -1: dp[i] = dp[i - 1] + i + 1 else: dp[i] = dp[i - 1] + i - idx record[s[i]] = i return sum(dp)