调皮的JM(字符串匹配,前缀和)

题目

题目链接
在竞码小学,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;
}

发布了69 篇原创文章 · 获赞 5 · 访问量 2005

猜你喜欢

转载自blog.csdn.net/lovingcgq/article/details/105465859