朴素的字符串匹配

字符串匹配

朴素的字符串匹配

挨个扫描就完了,简直太他妈朴素了,就这我还没写出来,看了之后手法还是很精妙的

#include<iostream>
using namespace std;
int StrLen(const char* str){
    const char* p = str;
    int i = 0;
    while(*p){
        i++;
        p++;
    }
    return i;
}
const char* StrStr(const char* str1,const char* str2){
    if(str2 == NULL){
        return NULL;
    }
    const char* p = str1;
    while(*p){
        const char* p1 = p;
        const char* p2 =str2;
        while(*p1 && *p2 && (*p1 == *p2)){
            p1++;
            p2++;
        }
        if(!*p2){
            return p;   //这里返回的实际上是源串的匹配好的字串,可能含有多余字符
        }               //如str1为mengziyue,str2为zi,这时返回的是ziyue
        p++;
    }
    return NULL;
}
int StrForLoop(const char* str1,const char* str2){
    int str1_len = StrLen(str1);
    int str2_len = StrLen(str2);
    int max_len = str1_len - str2_len;
    for(int i = 0;i < max_len;i++){
        int match_len = 0;
        while(match_len < str2_len &&                str1[i+match_len] == str2[match_len]
             ){
            match_len++;
        }
        if(match_len == str2_len){
            return i;
        }
    }
    return -1;
}
int main(){
    const char* str1 = "xiandianzikejidaxue";
    const char* str2 = "keji";
    const char* str3 = StrStr(str1,str2);
    cout<<str3<<endl;
    cout<<StrForLoop(str1,str2)<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/ziyuemeng/p/12393254.html

时间: 2024-10-01 15:38:18

朴素的字符串匹配的相关文章

字符串匹配——朴素算法、KMP算法

字符串匹配(string match)是在实际工程中经常会碰到的问题,通常其输入是原字符串(String)和子串(又称模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置.通常精确的字符串搜索算法包括朴素搜索算法,KMP, BM(Boyer Moore), sunday, robin-karp 以及 bitap.下面分析朴素搜索算法和KMP这两种方法并给出其实现.假设原字符T串长度N,子串P长度为M. 1.NAIVE-STRING-MATCHING. 朴素算法,该方法又称暴力搜索,

[CLRS][CH 32]字符串匹配

问题简介 对于给定文本 T[n] 和模式 P[m],找到一个位移量 s,使得 T[s + j] = P[j] (0 <= s <= n-m, 1 <= j <= m),则说明模式 P 在文本 T 中出现且位移为 s.所以字符串问题就是在给定文本 T 中,找出指定模式 P 出现的所有有效位移的问题. 记号和术语 长度为0的空字符串用 ? 表示.字符串 x 的长度用 |x| 表示.字符串 x, y 的连接表示为xy,长度为 |x|+|y|.对于字符串 x, y, w,如果 x = wy

算法系列笔记9(字符串匹配)

字符串匹配指有一个文本串S和一个模式串P,现在要查找P在S中的位置. 主要有以下算法: 其中朴素算法和KMP算法我们在这边bloghttp://blog.csdn.net/lu597203933/article/details/41124815中已经讲解过.RP算法时间复杂度较高,我也没看,想看可以看算法导论.这里主要讲解有限自动机的字符串匹配算法. 有限自动机的定义: 有限自动机字符串匹配主要是构建一个状态转移函数.&(q,a)表示状态q<其中状态q表示已经匹配成功q个字符了>接收字

Luogu P3375 【模板】KMP字符串匹配

P3375 [模板]KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了. 输入输出格式 输入格式: 第一行为一个字符串,即为s1(仅包含大写字母) 第二行为一个字符串,即为s2(仅包含大写字母) 输出格式: 若干行,每行包含一个整数,表示s2在s1中出现的位置 接下来1行,包括length(s2)个整数

字符串匹配的三种算法

下面将介绍三种有关字符串匹配的算法,一种是朴素的匹配算法,时间复杂度为O(mn),也就是暴力求解.这种方法比较简单,容易实现.一种是KMP算法,时间复杂度为O(m+n),该算法的主要任务是求模式串的next数组.另外还有一种对KMP算法的改进,主要是求nextval数组. 第一种朴素的匹配算法: int index(char str[], char subStr[]) { int i = 0, j = 0,index = 0; while (str[i] != '\0' && subStr

模式字符串匹配问题(KMP算法)

这两天又看了一遍<算法导论>上面的字符串匹配那一节,下面是实现的几个程序,可能有错误,仅供参考和交流. 关于详细的讲解,网上有很多,大多数算法及数据结构书中都应该有涉及,由于时间限制,在这就不重复了. 需要说明的是: stra:主串,及需要从中寻找模式串的字符串 strb:模式串 <算法导论>上面包括严蔚敏老师<数据结构>,字符串下表是按从1开始,并且<数据结构>一书中貌似吧字符串的第一个字符用来储存字符串长度.这里我改成了0. maxlen :字符串的最长

字符串匹配问题 ---- 算法导论读书笔记

字符串匹配是一个很常见的问题,可以扩展为模式的识别,解决字符串问题的思想被广泛地应用.介绍四种解决该问题的办法,包括:最朴素的遍历法,Rabin-Karp算法,自动机机匹配,Knuth-Morris-Pratt算法即耳熟能详的KMP. 在一开始,先对时间复杂度做出一个总扩(从大到小):[1]朴素法:O( (n-m+1)m ):[2]Rabin-Karp:预处理:O(m),匹配:最坏O( (n-m+1)m ),但是平均和实际中比这个好得多:[3]自动机:预处理O(m|Σ|),匹配O(n):[4]K

字符串匹配 - KMP算法

首先大致的学习一下有限自动机字符匹配算法,然后在讨论KMP算法. 有限自动机 一个有限自动机M是一个五元组(Q,q0,A,Σ,δ),其中: Q是状态的集合, q0∈Q是初始状态, A是Q的字集,是一个接受状态集合, Σ是一个有限的输入字母表, δ是一个从Q×Σ到Q的函数,叫做转移函数. 下面定义几个相关函数: φ(w)是M在扫描字符串w后终止时的状态.函数φ有下列递归关系定义:φ(ε) = q0,φ(wa) = δ(φ(w),a), σ(x)是x的后缀中,关于P的最长前缀的长度. 字符串匹配自动

算法——字符串匹配之KMP算法

前言 本节介绍Knuth-Morris-Pratt字符串匹配算法(简称KMP算法).该算法最主要是构造出模式串pat的前缀和后缀的最大相同字符串长度数组next,和前面介绍的<朴素字符串匹配算法>不同,朴素算法是当遇到不匹配字符时,向后移动一位继续匹配,而KMP算法是当遇到不匹配字符时,不是简单的向后移一位字符,而是根据前面已匹配的字符数和模式串前缀和后缀的最大相同字符串长度数组next的元素来确定向后移动的位数,所以KMP算法的时间复杂度比朴素算法的要少,并且是线性时间复杂度,即预处理时间复