KMP算法解决字符串出现次数

比如主串为:”1001110110”

子串为:”11“

则出现位置分别为:3 4 7

//KMP算法 2015.6.7

#include<iostream>
#include<stdlib.h>
using namespace std;

int main()
{
    char *s = "1001110110";
    char *p = "11";
    int ar[20] = { 0 };
    //next
    ar[0] =-1;
    int i = 0,l=-1;
    while (i < strlen(p)-1)  //next函数
    {
        if (l==-1||p[i] == p[l])
        {
            i++; l++;
            ar[i] = l;
        }
        else
            l = ar[l];
    }
    int m=0, n=0;
    while (m < strlen(s)) //根据next判断是否匹配
    {
        if (n==-1||s[m] == p[n])
        {
            m++; n++;
        }
        else n = ar[n];
        if (n == strlen(p))
        {
            cout << m - strlen(p) << endl;
            n == 0;
            m -= strlen(p)-1;
        }

    }
    system("pause");
    return 0;
}
时间: 2024-10-25 21:20:43

KMP算法解决字符串出现次数的相关文章

运用kmp算法解决的一些问题的简单题解

学习kmp算法我最后是看的数据结构书上的一本教材学会的..我觉得kmp相对于普通的BF算法就是避免了很多不必要的匹配,而kmp算法的精髓自然就在于next数组的运用...而next数组简而言之就是存储的就是模式串中第j个字符与主串中相应字符"失配"时,在模式串中需要重新和主串中失配的字符相比较的位置...我觉得这句概括挺好的... 题1: hdu   1711  number   sequence 题目链接: http://acm.hdu.edu.cn/showproblem.php?

kmp算法--求字符串子串--《数据结构》严蔚敏

// exam1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; void get_next(int* &next,char* s) { int j=0; int i=1; int len=strlen(s); next=(int*)malloc(len*sizeof(int)); memset(next,0,len*sizeof(int));

KMP算法解决字符串匹配

该算法由D.E.Knuth ,J.H.Morris和 V.R.Pratt提出,用于解决字符串匹配问题. 思想: 设目标串(主串)为s,模式串为t ,并设i指针和j指针分别指示目标串和模式串中正待比较的字符,设i和j的初值均为0.若有s[i]=t[j],则i和j分别加1.否则,i不变,j退回到j=next[j-1]的位置,再比较s[i]和t[j],若相等,则i和j分别加1.否则,i不变,j再次退回到j=next[j]的位置,依此类推.直到下列两种可能: 1. 模式串t中的字符全部匹配,则出现频率+

回朔法/KMP算法-查找字符串

回朔法:在字符串查找的时候最容易想到的是暴力查找,也就是回朔法.其思路是将要寻找的串的每个字符取出,然后按顺序在源串中查找,如果找到则返回true,否则源串索引向后移动一位,再重复查找,直到找到返回true,或者源串查找完也没有找到返回false:这种方法简单粗暴,但思路清晰.又因为每次查找失败,源串需要回到起始位置的下一个位置开始查找,所以该算法也称为回朔法. KMP算法:先对要查找的字符串进行分析,找出其中重复的子字符串.然后将目标串与源串比较,一旦比较失败,则不用回朔,而是根据目标串子串的

KMP算法 (字符串的匹配)

视频参考 对于正常的字符串模式匹配,主串长度为m,子串为n,时间复杂度会到达O(m*n),而如果用KMP算法,复杂度将会减少线型时间O(m+n). 设主串为ptr="ababaaababaa";,要比较的子串为a="aab": KMP算法用到了next数组,然后利用next数组的值来提高匹配速度,我首先讲一下next数组怎么求,之后再讲匹配方式. next数组详解 首先是理解KMP算法的第一个难关是next数组每个值的确定,这个问题困恼我很长时间,尤其是对照着代码一

(原创)数据结构之利用KMP算法解决串的模式匹配问题

给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置. 输入格式: 输入有两行: 第一行是主串S: 第二行是模式T. 输出格式: 输出相匹配的子串中的第一个字符在主串S中出现的位置.若匹配失败,输出0. 输入样例: 在这里给出一组输入.例如: aaaaaba ba 输出样例: 在这里给出相应的输出.例如: 6 解题思路:串的模式匹配有两种:一种是BF算法,一种是KMP算法:基于这道题给的数

字符串匹配(BF,BM,Sunday,KMP算法解析)

字符串匹配一直是计算机领域热门的研究问题之一,多种算法层出不穷.字符串匹配算法有着很强的实用价值,应用于信息搜索,拼写检查,生物信息学等多个领域. 今天介绍几种比较有名的算法: 1. BF 2. BM 3. Sunday 4. KMP -,BF算法 BF(Brute Force)算法又称为暴力匹配算法,是普通模式匹配算法. 其算法思想很简单,从主串S的第pos个字符开始,和模式串T的第一个字符进行比较,若相等,则主串和模式串都后移一个字符继续比较:若不相同,则回溯到主串S的第pos+1个字符重新

从零理解的KMP算法

KMP算法的优势 KMP算法是一个效率很高的字符串匹配算法,算法大意是:给定两个字符串y,x,判断x是否在y出现过.如果暴力搜索的话复杂度为O(lenx*leny),但用KMP算法解决的话, 我们只需要一个O(lenx)的预处理,优化暴力的复杂度变成O(lenx+leny),这里lenx,leny都代表字符串的长度. KMP算法的匹配方法 给定一个y为:ababacddsdfwwrababsababa 给定一个x为:ababa 我们先用暴力的方法跑一遍 1. ababacddsdfwwrabab

kmp算法简明教程

在字符串s中寻找模式串p的位置,这是一个字符串匹配问题. 举例说明: i = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 s = a b a a c a b a a a b a a b p = a b a a b j = 0 1 2 3 4 在kmp算法发明之前.人们使用这种算法: ''' 原始的求子串位置算法,O( m * n ) ''' def string_index_of( pstr, pattern, pos = 0 ): str_index = pos patte