【KMP算法】字符串匹配
2016-06-20 11:22
316 查看
一、问题
给定两个字符串S(原串)和(模式串)T,找出T在S中出现的位置。
二、朴素算法
当S[i] != T[j]时,把T往后移一位,回溯S的位置并重新开始比较。
[b]
View Code
hihocoder上的一个问题:如果next是动态分配,会导致TLE。
给定两个字符串S(原串)和(模式串)T,找出T在S中出现的位置。
二、朴素算法
当S[i] != T[j]时,把T往后移一位,回溯S的位置并重新开始比较。
[b]
#include <iostream> #include <string> using namespace std; //计算next数组 void get_next(string& T, int* next) { int i = 0, j = -1, Tlen = T.length(); next[0] = -1; while(i < Tlen) { if(j == -1 || T[i] == T[j]) { ++i; ++j; next[i]=(T[i] == T[j] ? next[j]:j);//使得回溯前和回溯后的元素不一样 } else j = next[j]; } } //计算T在S中出现的次数 int subStrCnt(string& S, string& T) { int cnt = 0; int Slen = S.length(), Tlen = T.length(); int next[10000]; int i = 0, j = 0; get_next(T, next); while(i < Slen && j < Tlen) { if(j == -1 || S[i] == T[j]) { ++i; ++j; } else j = next[j]; if(j == Tlen){//T匹配完成,从T: next[j]再开始 cnt++; j = next[j]; } } return cnt; } int main() { int cnt; string S, T; cin>>cnt; while(cnt-- > 0) { cin>>T>>S; cout<<subStrCnt(S, T)<<endl; } return 0; }
View Code
hihocoder上的一个问题:如果next是动态分配,会导致TLE。
相关文章推荐
- Android中的HTTP通信
- 1.认识Hibernate
- 关于图像处理
- SQL-存储过程基础知识
- 软件需求分析方法
- java.lang.NoSuchFieldError 异常原因
- 制作Android Demo GIF:程序演示效果GIF图录制
- String类为什么是final的?
- 朴素贝叶斯分类并行化算法
- eclipse插件
- placeholer字体颜色修改
- mac 安装reportlab工具
- CI框架编码问题总结_第一个MVC案例
- 常用 SQL Server 规范集锦
- 运用TensorFlow处理简单的NLP问题
- 个人工作总结11(第二阶段)
- 俄罗斯方块
- Java多线程实现的三种方式
- ubuntu16.04 LTS 编译 AndroidL 报错 recipe commences before first targe
- iOS程序结构APPDelegate&UIApplication