kmp字符查找

转载 2012年03月21日 20:20:25
 
/*
002 作者:小马过河
003 */
004 #include <iostream>
005 #include <string.h>
006 using namespace std;
007   
008 int Kmp(char father_str[],char son_str[],int next[]);  //next为son_str的next[j] 
009 int Next(char son_str[],int next[]);       //求son_str模式串的next[j] 
010   
011 int main()
012 {
013     int n = 0;
014     char *f = "abcdeefghij";
015     char *s = "aaaba";
016     n = strlen(s);
017     int next[n];
018      
019     Next(s,next);
020     cout<<"next的值如下:"<<endl;
021     for (int i=0; i<n; i++)
022     {
023        cout<<next[i]<<endl;
024     }
025     cout<<endl;
026     int pos = Kmp(f,s,next);
027     cout<<"pos = "<<pos<<endl;
028     system("pause");
029     return 0;
030 }
031   
032 int Kmp(char father_str[],char son_str[],int next[])
033 {
034     int i = 0;
035     int j = 0;
036     int pos = -1;
037     //求的主串和模式串的长度 
038     int lenfather = strlen(father_str);
039     int lenson = strlen(son_str);
040      
041     //提出不符合匹配的情况 
042     if (lenfather ==0 || lenson == 0 || lenson>lenfather)
043     {
044         return pos;
045     
046     int ncount = 0;
047     while (i<lenfather && j<lenson)
048     {
049           cout<<ncount<<": "<<"i="<<i<<"  j="<<j<<endl;
050           ncount++;
051           if (j==-1 || father_str[i] == son_str[j])
052           {
053               i++;
054               j++;
055           }
056           else
057           {
058               j = next[j];
059           }
060     
061     cout<<"j="<<j<<endl;
062     if (j>=lenson-1)
063     {
064         pos = i-lenson;
065     }
066     else
067     {
068         pos = -1;
069     }
070     return pos;
071 }
072   
073 //求son_str模式串的每一位next[j]值并保存在next里面  它和主串没有关系,和要找的串有关系 
074 /***
075 next[j]意义:规定next[0]=-1或其他的值,next[j]就是求模式串son[j]中前面有多少已经匹配的字符
076 举例:
077 t = aaab
078 j = 0: next[0]=-1
079 j = 1: next[1]=0
080 j = 2: t0=t1 next[2] = 1
081 j = 3: t0t1 = t1t2  所以next[3]=2 
082    
083 ***/ 
084 int Next(char son_str[],int next[])
085 {
086     int j = 0; 
087     int k = -1;
088     next[0] = -1;
089     int lenson = strlen(son_str);
090     while (j<lenson)
091     {
092           if (k==-1 || son_str[j] == son_str[k])
093           {
094               j++;
095               k++;
096               next[j] = k;
097           }
098           else
099           {
100               k = next[k];
101           }
102     }  
103 }

快速排序,希尔排序以及KMP字符查找算法

#include void quicksort(int arr[], int left, int right)//快速排序 { int low = left; int high = right; in...

GUI之KMP字符匹配算法

  • 2017年10月18日 23:13
  • 50KB
  • 下载

Kmp字符匹配算法优化C++实现

C++实现Kmp字符匹配算法的优化版   头文件:KmpAlgorithm.h #ifndef KMPALGORITHM_H #define KMPALGORITHM_H #include ...

kmp变形 如何判断第i个字符是否匹配函数 hdu 4749

题目来源: http://acm.hdu.edu.cn/showproblem.php?pid=4749 题意:  题意:给出两个数字串A、B。问A中有多少不相交的子串a能匹配B。匹配的意思是a...

KMP字符匹配算法学习笔记

KMP算法的本质在于对需要匹配字符串内部进行了分析标记使得在进行匹配时可以通过标记减少无意义的匹配次数。 它的原理是找出需匹配串中的每个字符之前的最长重复字符段(这个字符段当然是从第一个字符开始就和...

hdoj 3746 Cyclic Nacklace 【kmp 求至少在结尾添加多少个字符可以凑够至少两次循环】

Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)...

字符匹配 kmp算法

// KMPTest.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include...

KMP--字符匹配

/******* kmp_1.cpp ******/  #include #include #include"kmp_2.h" void get_next(char *T,int *next)...
  • why_up
  • why_up
  • 2011年10月07日 14:20
  • 367

LeetCode_28---Implement strStr() [KMP算法,字符匹配算法]

Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle...

POJ-3461 Oulipo-匹配的字符有几个(KMP算法)

Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29308   Accepted: 11749 ...
  • MIKASA3
  • MIKASA3
  • 2015年08月16日 09:15
  • 537
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:kmp字符查找
举报原因:
原因补充:

(最多只允许输入30个字)