开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标2000分,现在1984!!
12月26日每日一题
1759. 统计同构子字符串的数目
给你一个字符串 s ,返回 s 中 同构子字符串 的数目。由于答案可能很大,只需返回对 109 + 7 取余 后的结果。
同构字符串 的定义为:如果一个字符串中的所有字符都相同,那么该字符串就是同构字符串。
子字符串 是字符串中的一个连续字符序列。
示例 1:
输入:s = "abbcccaa"
输出:13
解释:同构子字符串如下所列:
- "a" 出现 3 次。
- "aa" 出现 1 次。
- "b" 出现 2 次。
- "bb" 出现 1 次。
- "c" 出现 3 次。
- "cc" 出现 2 次。
- "ccc" 出现 1 次。
- 3 + 1 + 2 + 1 + 3 + 2 + 1 = 13
示例 2:
输入: s = "xy"
输出: 2
解释: 同构子字符串是 "x" 和 "y" 。
示例 3:
输入: s = "zzzzz"
输出: 15
提示:
1 <= s.length <= 105s由小写字符串组成
代码
数学题
因为「同构子字符串」为一个连续的字符序列且需要序列中的字符都相同,我们要找的是每个字符对答案的贡献度。
对于abbcccaa
- i = 0的a的贡献度为1
- i = 1的b的贡献度为1
- i = 2的b的贡献度为2
- i = 3的c的贡献度为1
- i = 4的c的贡献度为2
- i = 5的c的贡献度为3
- i = 6的a的贡献度为1
- i = 7的a的贡献度为2
- 所以答案就是1 + 1 + 2 + 1 + 2 + 3 + 1 + 2 = 13
不难发现,对于位于i的字母x,他的贡献值为前面连续相同字母的个数+1。
用双指针滑动窗口可解。
解法
class Solution {
public int countHomogenous(String s) {
int res = 0;
int l = 0;
int mod = 1000_000_007;
char[] chars = s.toCharArray();
for(int i = 0; i < chars.length; i++) {
if(chars[i] == chars[l]) {
res = res + i - l + 1;
} else {
l = i;
res++;
}
res = res % mod;
}
return res;
}
}