2018年3月美团春招笔试题 字符串距离

举报
用户已注销 发表于 2021/11/19 05:36:40 2021/11/19
【摘要】 题目: 字符串距离 时间限制:C/C++语言 2000MS;其他语言 4000MS内存限制:C/C++语言 65536KB;其他语言 589824KB 题目描述: 给出两个相同长度的由字符 a 和 b 构成的字符串,定义它们的距离为对应位置不同的字符的数量。...

题目:

字符串距离

时间限制:C/C++语言 2000MS;其他语言 4000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB

题目描述:

给出两个相同长度的由字符 a 和 构成的字符串,定义它们的距离为对应位置不同的字符的数量。如串”aab”与串”aba”的距离为 2;串”ba”与串”aa”的距离为 1;串”baa”和串”baa”的距离为 0。下面给出两个字符串 与 T,其中 的长度不小于 的长度。我们用|S|代表 的长度,|T|代表 的长度,那么在 中一共有|S|-|T|+1 个与 长度相同的子串,现在你需要计算 串与这些|S|-|T|+1 个子串的距离的和。

输入

第一行包含一个字符串 S

第二行包含一个字符串 T

和 均由字符 和 组成,1 ≤ |T| ≤ |S| ≤10

输出

输出对应的答案。

样例输入

aab

aba

样例输出

2

Hint

Input Sample 2

aaabb

bab

Output Sample 2

5

在样例 2 中,”aaa””bab”的距离为 2”aab””bab”的距离为 1”abb””bab”的距离为 2

所以最后答案为 5


这个题目的数据量是|T|<|S|<10^5

所以直接暴力的解法是O(|S|*|T|)肯定会超时的。

我的解法是O(|S|)的,肯定不会超时了。

关键词:反演

具体思路:对于T中的每个字符,都是要和S中的连续|S|-|T|+1个字符相比较的。

比如T中的第1个字符,要和S的前|S|-|T|+1个字符相比较

T中的第2个字符,要和S的第2个字符到第|S|-|T|+2个字符相比较

。。。。。。

每次统计T中的1个字符和S中的|S|-|T|+1个字符有多少个是不一样的,

当统计T中的下一个字符时,S中的|S|-|T|+1个字符只要往右移一步就行,就是去掉第一个字符,再在最后一个字符后面补一个新的字符。

代码:


  
  1. #include<iostream>
  2. #include<string.h>
  3. using namespace std;
  4. char s[100001], t[100001];
  5. int main()
  6. {
  7. cin >> s >> t;
  8. int a = 0, b = 0, ls = strlen(s), lt = strlen(t), su = 0;
  9. for (int i = 0; i < ls - lt + 1; i++)if (s[i] == 'a')a++; else b++;
  10. for (int i = ls - lt; i < ls; )
  11. {
  12. if (t[i - ls + lt] == 'a')su += b; else su += a;
  13. if (s[i - ls + lt] == 'a')a--; else b--;
  14. if (s[++i] == 'a')a++; else b++;
  15. }
  16. cout << su;
  17. return 0;
  18. }

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/79660588

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。