开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个字符串 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由小写字符串组成
二、思路分析
使用双指针的思想,设立两个指针p和q,首先遍历整个字符串,即用p指向每一个字符,每遍历一个字符先将ans加1,然后进入一个死循环,并判断该字符是否与它后面的一个字符相等,即使q=p+1,判断p是否等于q,是的话令q再加1,并使ans再加上q与p的差值;不等于的话则跳出死循环。
最后按题目的要求,返回ans对109 + 7取余后的结果。
三、AC代码
class Solution {
public:
const int mod = 1e9 + 7;
int countHomogenous(string s) {
int n=s.size();
long long ans=0,p,q,j;
for(int i=0;i<n;i++){
ans=ans+1;
p=i;
q=i+1;
while(1){
if(q<n&&s[q]==s[p]){
q++;
ans=ans+q-p;
}
else{break;}
}
i = q - 1;
}
return ans % mod;
}
};
提交排名
四、总结
题目总体不难,需要熟练。