字符串的朴素模式匹配算法

#include <stdio.h>
#include <string.h>

//返回第一个子串在主串的位置,找不到返回-1

int StrMatch(char *source, char *match){
    int slen=strlen(source);
    int mlen=strlen(match);
    int i=0,j=0;

    while(i<slen && j<mlen){//当主串或者子串全部匹配完,就退出循环
        if(source[i] == match[j]){//逐个比较,匹配就比较下一个
            ++i;
            ++j;
        }else{//不匹配就重新回到刚开始的下一个位置
            i = i-j+1;
            j = 0;
        }
    }

    if(j == mlen){//说明子串全部都匹配成功,返回子串在主串的位置
        return  (i-j);
    }else{
        return -1;
    }

}

void main(){

    char str[] = "hello, tom ,how are you!";
    char match[] = " tom ";
    int result;

    result = StrMatch(str,match);
    printf("-->%d\n",result);

}
时间: 2024-07-28 21:03:21

字符串的朴素模式匹配算法的相关文章

图解字符串的朴素模式匹配算法

复习串的朴素模式匹配算法 模式匹配 : 子串定位运算,在主串中找出子串出现的位置. 在串匹配中,将主串 S 称为目标(串),子串 T 称为模式(串).如果在主串 S 中能够找到子串 T, 则称匹配成功,返回 第一个 和 子串 T 中 第一个字符 相等 的 字符 在主串 S 中的 序号,否则,称匹配失败,返回 0. 算法思想: 从主串 S 的第 pos 个字符起和模式 T 的第一个字符比较之,若相同,则两者顺次的去比较后续的每一个字符,否则从主串 S 的下一个字符起再重新和模式 T 的字符比较之.

字符串模式匹配算法之一:朴素模式匹配算法

被搜索的字符串称为主串,待搜索的字符串称为模式串.朴素模式匹配算法的基本思想: 对主串的每一个字符作为子串开头,与模式串进行匹配.对主串做大循环,每个字符开头做模式串长度的小循环,直到匹配成功或全部遍历完成为止. 代码实现非常简单: int strStr(char *haystack, char *needle) { for (int i = 0; ; ++i) { for (int j = 0; ; ++j) { if (!needle[j]) return i; if (!haystack[

模式匹配- 朴素模式匹配算法

■朴素的模式匹配算法(Brute-Force,BF算法,蛮力算法)-换下一个,从头再来. 模式匹配的最原始想法,从目标串T的的第一个字符开始与模式串P的第一个字符开始进行比较,如果相等,则继续对后续的字符进行比较,否则目标串T从第二个字符开始与模式串P的第一个字符重新比较,直至模式串P中的每个字符依次和目标串T中的一个子串相等为止,此时称为匹配成功,否则匹配失败. 如果模式串P的长度是m,目标串T的长度是n,假设最坏的情况是每遍比较都在最后出现不等,即每遍最多比较m次,最多比较n-m+1遍,总的

朴素和KMP模式匹配算法(Java)

朴素模式匹配算法 public class Test { //朴素模式匹配算法 public int Index(String s,String t,int pos){ int i = pos;//主串中第几个位置开始比较 int j = 0;//模式串中的第一个位置 while(i<s.length()&&j<t.length()){ if(s.charAt(i)==t.charAt(j)){ i++; j++; }else { i = i-j+1;//主串的下一个位置 j

字符串模式匹配算法之二:KMP算法

KMP算法简介 KMP算法全称叫做Knuth-Morris-Pratt Algorithm. 被搜索的字符串称为主串,待搜索的字符串称为模式串. 我们知道朴素模式匹配算法:http://blog.csdn.net/chfe007/article/details/43448655是很低效的,KMP算法从模式串出发,发现模式串中隐藏的信息来减少比较的次数,具体如何做到的可以移步这个链接:http://kb.cnblogs.com/page/176818/ KMP算法的关键在于next数组值的推导.

串-KMP模式匹配算法(nextval数组)

#include <stdio.h> #include <stdlib.h> #include <string.h> void get_next(char T[100],int *next); int Index_KMP(char S[100],char T[100],int pos); int main() { int n; char S[100],T[100]; gets(S); gets(T); n=Index_KMP(S,T,2); printf("%

4.2 串的模式匹配算法

<?php header("content-type:text/html;charset=utf-8"); class Linear_string{ /** * 串模式匹配算法 * *包括 * 1.串的初始化 __contruct() * 2.朴素的模式匹配算法 index() * 3.KMP模式匹配算法 * 4.改进的KMP模式匹配算法 */ private $string; private $length; //构造函数 public function __construct

字符串模式匹配算法--详解KMP算法

在软考的复习中,看到过几次  字符串的模式匹配算法.看起来挺难的.所以花了点时间查了查关于字符串匹配的算法.下面详细介绍一下KMP模式匹配算法 什么是字符串的匹配? 在文章中进行查找.需要找到要查找的内容所在的位置.就是字符串的匹配. 朴素的模式匹配算法 朴素的模式匹配算法,就是把要查找的内容,一步步的与要查找的文章进行进行比较.如果匹配失败,则主串和字串回溯.字串位置加1.重新匹配. 模式匹配算法的流程如下: 在匹配失败的情况下,模式串仅右移一个 之后.在从头开始匹配. 两个for循环 For

数据结构——串的朴素模式和KMP匹配算法

一.朴素模式 假设我们要从主串S="goodgoogle"中找到子串T="google"的位置,步骤如下: i表示主串的当前位置下标,j表示子串的当前位置下标,如上图在第一轮比较(i=1开始)中j=4和i=4的位置不匹配,接下来就要指针回退,从i=2开始比较,如下: 如此反复直到比较到 i =(主串长度-子串长度+1)的位置或者 j = 子串的长度 就退出比较循环,上面的主串和子串在比较到i=5的位置就完全匹配了. #include <stdio.h>