问题描述: 给定两个字符串T, P.查找字符串P在字符串T中出现的次数. 解决方法: 典型的KMP算法的题目,在此使用的KMP算法为算法导论上介绍的算法.下一篇文章将详细介绍KMP算法的计算过程. 题目链接: http://hihocoder.com/problemset/problem/1015 源代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #define M 9999 #defin…
题目: 经典的KMP算法 分析: 和KMP算法对应的是BF算法,其中BF算法时间复杂度,最坏情况下可以达到O(n*m),而KMP算法的时间复杂度是O(n + m),所以,KMP算法效率高很多. 但是KMP算法不太好理解,其中牵涉到next数组,目标就是让模式串尽可能的往右滑动,减少比较次数,比如 a  b  a  b  c -1 0  0  1  2 比如我们比较ababc时,如果c比较发现错误,前面的abab已经比较成功,那么下次比较,我们只需要从aba的最后一个a开始比较,这样省去了从头开始…
KMP类似暴力,但是不会和暴力完全一样,回溯到起点. 简单的说  假如   模板链字符串是:        abcabcabcabd        寻找abcabd 在模板链出现的次数,并且输出该次数. 完全暴力过程: 假设  a[]为模板链,b[]为要查找的子序列. 先取b[]的首一直对应,然后a[],b[]同时移动,当a[],b[]不匹配的时候,b[]回到起点,a[]向后移动单位1.              这点很容易想到,我写出来是为了方便和后面的KMP算法作比较. KMP过程: 假设仍…
KMP算法 Knuth–Morris–Pratt algorithm 克努斯-莫里斯-普拉特 算法 algorithm kmp_search: input: an array of characters, S (the text to be searched) an array of characters, W (the word sought) output: an array of integers, P (positions in S at which W is found) an int…
计算某字符串中子串出现的次数. public static void main(String[] args) { String s1 = "adcdcjncdfbcdcdcd"; String s2 = "cd"; count(s1, s2); } public static void count(String str1, String str2) { int count = 0; if (str1.equals("") || str2.equa…
回朔法:在字符串查找的时候最容易想到的是暴力查找,也就是回朔法.其思路是将要寻找的串的每个字符取出,然后按顺序在源串中查找,如果找到则返回true,否则源串索引向后移动一位,再重复查找,直到找到返回true,或者源串查找完也没有找到返回false:这种方法简单粗暴,但思路清晰.又因为每次查找失败,源串需要回到起始位置的下一个位置开始查找,所以该算法也称为回朔法. KMP算法:先对要查找的字符串进行分析,找出其中重复的子字符串.然后将目标串与源串比较,一旦比较失败,则不用回朔,而是根据目标串子串的…
在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法,即下标从0开始. BF算法 BF(Brute Force)算法也就是传说中的“笨办法”,是一个暴力/蛮力算法.设串S和P的长度分别为m,n,则它在最坏情况下的时间复杂度是O(m*n).BF算法的最坏时间复杂度虽然不好,但它易于理解和编程,在实际应用中,一般还能达到近似于O(m+n)的时间度(最坏情…
这一章学习之后,我想对串这个部分写一下我的总结体会. 串也有顺序和链式两种存储结构,但大多采用顺序存储结构比较方便.字符串定义可以用字符数组比如:char c[10];也可以用C++中定义一个字符串string a;这就需要根据具体场景来选择合适方便操作的方法.还有空串和空格串是不同的,空串字符长度为0(符号‘∅’),空格串包含一个或多个空格.这一章学习了两个串的模式匹配算法,特别是KMP算法,从中受益匪浅. 一.串 1.BF(Brute-Force)算法 这个模式匹配算法简单直观,被人们称为暴…
1.顺序串 实现的操作有: 构造串 判断空串 返回串的长度 返回位序号为i的字符 将串的长度扩充为newCapacity 返回从begin到end-1的子串 在第i个字符之前插入字串str 删除子串 在实现返回位序号从begin到end-1的子串时,注意,此处串的起始位置为0,同时为了方便,我们再次没有新建一个变量,而是返回一个string,可以直接输出,在main函数中可以看到. 通过string.indexof()函数将字符数组转化为字符串. 同时在实现每个字符串的操作之前,先进行异常处理,…
设有主串s和子串t,子串t的定位就是要在主串中找到一个与子串t相等的子串.通常把主串s称为目标串,把子串t称为模式串,因此定位也称为模式匹配. 模式匹配成功是指在目标串s中找到一个模式串t: 不成功则指目标串s中不存在模式串t Brute-Force算法 采用穷举的思路,从目标串s的第一个字符开始和模式串t的第一个字符开始比较 若相等,则继续逐个比较后续字符 不相等则从目标串s的第二个字符开始重新与模式串t的第一个字符进行比较 若匹配成功则返回主串中第一次出现模式串的位置,匹配失败返回-1 以目…