本题就是给出非常多对字符串,然后问一个字符串在另外一个字符串出现的次数。

就是所谓的Strstr函数啦。

Leetcode有这道差点儿一模一样的题目。

使用KMP算法加速。算法高手必会的算法了。

另外看见讨论说什么使用KMP还超时,最大可能是没有真正理解next table的含义,写了错误的代码,故此尽管自己执行结果正确,可是却没有真正发挥next table的作用。使得算法退化为暴力法了,所以执行正确,但超时。

KMP參考: http://blog.csdn.net/kenden23/article/details/14178121

#include <stdio.h>
#include <string.h> const int MAX_N = 10001;
const int MAX_T = 1000001;
char word[MAX_N];
char text[MAX_T];
int nextTbl[MAX_N];
int wn, tn; int getTimes()
{
int ans = 0;
int i = 0, j = 0; //i为text的当前下标,j为word的当前下标
for (; i-j <= tn-wn; i++)
{
if (text[i] == word[j])
{
j++;
if (j == wn)
{
ans++;
j = nextTbl[j-1];
}
}
else if (j > 0)
{
j = nextTbl[j-1];
i--;
}
}
return ans;
} void genTbl()
{
memset(nextTbl, 0, sizeof(int) * (wn)); int i = 1, j = 0;
while (i < wn)
{
if (word[i] == word[j]) nextTbl[i++] = ++j;
else if (j > 0) j = nextTbl[j-1];
else i++;
}
} int main()
{
int T;
scanf("%d", &T);
getchar();
while (T--)
{
gets(word);//fgets(word, MAX_N, stdin);//fgets会在末尾保留'\n'
gets(text);//fgets(text, MAX_T, stdin);
wn = strlen(word);
tn = strlen(text);
genTbl();
printf("%d\n", getTimes());
}
return 0;
}

最新文章

  1. 《超实用的JavaScript代码段》—— 读后总结
  2. C++ string类的实现
  3. 字符串匹配(KMP算法)
  4. java jms
  5. 折腾了半天,终于搞定了apache的rewrite功能
  6. [Express] Level 5: Route file
  7. 建立自己的bin目录,在当前路径运行shell脚本
  8. high volume logging
  9. Linux开发环境的搭建和使用——Linux 常用的命令使用
  10. Java达到MySQL数据库备份(两)
  11. CSS基础--常用样式
  12. Zepto.js库touch模块代码解析
  13. 经典面试题:从 URL 输入到页面展现到底发生什么?
  14. (11)ssh免密登录配置
  15. JavaScript字符串转换为数字
  16. c++中为什么可以通过指针或引用实现多态,而不可以通过对象呢?
  17. SAP月结操作讲解
  18. IP相关的方法
  19. 如何让两个div并排,并且div要看得见边框
  20. openstack 的 lbaas 疑问

热门文章

  1. 去除windows编辑文本中的回车符
  2. conda常用命令,如何在conda环境中安装gym库?
  3. 紫书 例题 10-22 UVa 1640(数位统计)
  4. Unity 获得视频的某一帧,生成缩略图
  5. qt 闰年
  6. POJ——T 1182 食物链
  7. html5的代码验证
  8. vim 插件之 surround.vim
  9. django 笔记2
  10. JS实现页面跳转 浏览器地址栏保持不变