设为首页 加入收藏

TOP

HDU 2203 亲和串 KMP解法
2015-07-20 18:02:07 来源: 作者: 【 】 浏览:2
Tags:HDU 2203 亲和 KMP 解法

本题就是找子字符是否出现。
不过稍微问了个循环字符串,直接把原来的字符串复制多一倍就可以了。
剩下的就是strstr函数的实现了。
当然你要偷懒直接调用,strstr函数,或者使用string中的find函数都是可以过掉的。不过面试的时候就不能这么做了。
这个时候使用KMP是很好的办法,听说微软面试,看到你用KMP也无可挑剔了,故此要学好这个算法。

以前学这个算法学了好长时间,现在看来这个算法也是基础算法了,高手必须熟练的。


#include 
  
   
#include 
   
     const int MAX_N2 = 100002; const int MAX_N1 = 200005; char s1[MAX_N1]; char s2[MAX_N2]; int nextTbl[MAX_N2]; int N1, N2; void getNext() { memset(nextTbl, 0, sizeof(int) * N2); for (int i = 1, j = 0; i < N2; i++) { if (s2[i] == s2[j]) nextTbl[i] = ++j; else if (j > 0) { j = nextTbl[j-1]; i--; } } } int main() { while (gets(s1)) { gets(s2); N1 = strlen(s1); N2 = strlen(s2); if (N1 < N2) { puts("no"); continue; } strncpy(s1+N1, s1, N1); //concatenate, double s1 characters N1 <<= 1; N1--; getNext(); int j = 0; for (int i = 0; N2-j <= N1-i && j < N2; i++) { if (s1[i] == s2[j]) j++; else if (j > 0) { j = nextTbl[j-1]; i--; } } if (j == N2) puts("yes"); else puts("no"); } return 0; }
   
  



】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇codeforces 17A Noldbach problem 下一篇hdu 1024 Max Sum Plus Plus(DP)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: