题目描述
题意很简单,给一个数n 以及一个字符串str,区间【i,i+n-1】 为一个新的字符串,i 属于【0,strlen(str)】如果新的字符串出现过ans++,例如:acmacm n=3,那么 子串为acm cma mac acm ,只有acm出现过
求ans;
输入
LINE 1: T组数据(T<10)
LINE 2: n ,n <= 10,且小于strlen(str);
LINE 3:str
str 仅包含英文小写字母 ,切长度小于10w
LINE 2: n ,n <= 10,且小于strlen(str);
LINE 3:str
str 仅包含英文小写字母 ,切长度小于10w
输出
求 ans
样例输入
2 2 aaaaaaa 3 acmacm
样例输出
5 1
思路一:用substr函数将字符串分离,然后set函数不能重复插入这一特点,通过测量长度计算是否是第一次出现
思路二:还是先用substr函数将字符串分离,用map标记是第几次出现,出现过一次的都标记为1,统计个数
#include<stdio.h> #include<algorithm> #include<string> #include<iostream> #include<set> using namespace std; int main() { int n,m; cin>>n; while(n--) { cin>>m; string s,s1; cin>>s; set<string>S; int len=0,sum=0; for(int i=0;i<s.size()-m+1;i++) { s1=s.substr(i,m); S.insert(s1); if(len==S.size()) sum++; else len=S.size(); } printf("%d\n",sum); } return 0; }<pre name="code" class="html">#include<stdio.h> #include<algorithm> #include<string> #include<iostream> #include<map> using namespace std; int main() { int n,m; string s; scanf("%d",&n); while(n--) { int sum=0; string s1; map<string,int>M; scanf("%d",&m); cin>>s; for(int i=0; i<s.size()-m+1; i++) { s1=s.substr(i,m); if(M[s1]==1) sum++; else if(M[s1]==0) M[s1]=1; } printf("%d\n",sum); } return 0; }
本文介绍了一种计算字符串中特定长度子串首次出现次数的方法,提供了两种实现思路及代码示例,利用C++中的标准库函数如substr、set和map进行高效处理。

1198

被折叠的 条评论
为什么被折叠?



