题目
题目链接
在竞码小学,JM同学是捣蛋三巨头之一,调皮的很。
有一次,在课外活动的时候,JM同学偷偷跑到老师办公室玩耍,一不小心把英语老师电脑上准备上课用的英文文章给删掉了,导致英语老师暴跳如雷,生气的很~
老师给了JM一个改过自新的机会,如果JM能够找出删除的文章HH中出现了多少个子串与字符串SS等价,那么老师将原谅JM同学,否则,请家长是免不了的~
对于两个字符串等价,我们的定义为:两个字符串按照字典序排序后相同,则认为是等价字符串。
例如:aabaab 和 baabaa 两个字符串为等价字符串
abaaba 和 bbabba 则不是等价字符串。
输入
第一行输入一个字符串SS
第二行输入一个字符串HH
输出
输出子串个数
样例
输入
aab
abacabaa
输出
3
提示
样例解释
第一个等价子串 abacabaa
第二个等价子串 abacabaa
第三个等价子串 abacabaa
数据规模
对于50%50%的数据,|S|,|H| <= 2000
对于100%100%的数据∣S∣,∣H∣<=100000,保证输入的字符串只有小写字母
解题思路:因为是两个字符串按照字典序排序后相同,则认为是等价字符串。所以可以通过前缀和的方式来匹配。具体可以看代码
代码:
#include<cstdio>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(void){
vector<int> cnt1(26),cnt2(26); //空间设置为26
string s,t;
cin >> s >> t;
int lens = s.size();
int lent = t.size();
int ans = 0 ;
for(int i =0 ;i < lens;i++){
cnt1[s[i] - 'a']++;
}
for(int i = 0;i < lent;i++){
cnt2[t[i] - 'a']++;
if(i >= lens)
cnt2[t[i-lens] - 'a']--; //这一步巧妙的让cnt2只记录lens长度的前缀和
if(cnt1 == cnt2) //vector可以直接相等
ans++;
}
cout << ans;
return 0;
}