字符串匹配的几种算法

字符串匹配算法:找到子串在原字符串中第一次出现的位置

字符串A:abcabcabcabc

字符串B:bca

1、朴素字符串匹配算法

假设有两个指针,一个i指向字符串A的起始位置,一个j指向字符串B的起始位置;

(1)若A[I]==B[j],则i++;j++

(2)在(1)的情况下,若A[i]!=A[j],则j=0,i回到A字符串的上一次的起始位置。

缺点:不适用于那种多个相同的,不能找到第一个相同的位置。

int string_match(char*str1, char*str2)
{
    int n = strlen(str1);
    int m = strlen(str2);
    for (int i=0;i<=n-m;i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (str1[i] != str2[j])
                break;
            if (j == m - 1)
                return i - m;
        }
    }
}
int main()
{
    char str1[1000], str2[1000];
    cin >> str1 >> str2;
    int m = string_match(str1, str2);
    cout << m;
    return 0;
}

原文地址:https://www.cnblogs.com/xiaotuzihenmang/p/8486327.html

时间: 2024-10-08 14:59:42

字符串匹配的几种算法的相关文章

字符串匹配的三种算法

下面将介绍三种有关字符串匹配的算法,一种是朴素的匹配算法,时间复杂度为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 :字符串的最长

字符串匹配的三种方法

字符串匹配,实现c++ strstr()函数 1.蛮力法 1 int strStr(string haystack, string needle) { 2 3 int i, hSize = haystack.size(), nSize = needle.size(); 4 if(hSize < nSize) 5 return -1; 6 if(nSize == 0) 7 return 0; 8 for(i = 0; i <= hSize - nSize && haystack.

在一个字符串中,统计大写字母个数,小写字母个数,其他字符个数的四种算法

题目描述:编写程序,输出字符串中的大写字母.小写小母和其他的个数.如有一个字符串"Helle, This is A test textfile.123456, tannk you!!",则其大写字母个数:3,小写字母个数:29,其他字符个数:18. 这里提供了四种算法,第一种是我们比较好理解的,也属于硬编码问题,其他三种方法要借助JAVA语言的jdk提供的api. 方法一: <!DOCTYPE html> <html lang="en"> &

字符串匹配问题【KMP算法】

一.问题 给定两个字符串S和T,找出T在S中出现的位置. 二.朴素算法 当S[i] != T[j]时,把T往后移一位,回溯S的位置并重新开始比较.    (1) 成功匹配的部分(ABC)中,没有一样的字符 S: i A B C A B C E T: j A B C E       S: i A B C A B C E T: j   A B C E     S: i A B C A B C E T: j     A B C E   S: i A B C A B C E T: j       A B

字符串匹配(KMP)算法及Java实现

一.什么是KMP算法? 维基百科的解释是:在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始,从而避免重新检查先前已经匹配过的字符. 二.字符串的前缀与后缀 前缀:字符串除了最后一个字符的全部头部组合: 后缀:字符串处理第一个字符的全部头部组合:例如 三.字符串部分匹配表 "部分匹配"的实质是,有时候,字符串头部和尾部会有重

字符串匹配(三)----后缀数组算法

一.什么是后缀数组: 字符串后缀Suffix 指的是从字符串的某个位置开始到其末尾的字符串子串.后缀数组 Suffix Array(sa) 指的是将某个字符串的所有后缀按字典序排序之后得到的数组,不过数组中不直接保存所有的后缀子串,只要记录后缀的起始下标就好了. 比如下面在下面这张图中,sa[8] = 7,表示在字典序中排第9的是起始下标为7的后缀子串,这里还有一个比较重要的数组rank,rank[i] : sa[i]在所有后缀中的排名 ,比如rk[5]=0,表示后缀下标为5的子串在后缀数组中排

[算法系列之十四]字符串匹配之Morris-Pratt字符串搜索算法

前言 我们前面已经看到,蛮力字符串匹配算法和Rabin-Karp字符串匹配算法均非有效算法.不过,为了改进某种算法,首先需要详细理解其基本原理.我们已经知道,暴力字符串匹配的速度缓慢,并已尝试使用Rabin-Karp中的一个散列函数对其进行改进.问题是,Rabin-Karp的复杂度与强力字符串匹配相同,均为O(mn). 我们显然需要采用一种不同方法,但为了提出这种不同方法,先来看看暴力字符串匹配有什么不妥之处.事实上,再深入地研究一下它的基本原理,就能找到问题的答案了. 在暴力匹配算法中,需要检

时空权衡之字符串匹配中的输入增强技术

字符串匹配的蛮力的算法: 对于字符数为n的文本,模式(要匹配的字符串)字符为m的字符串,简单的从左到右比较模式和文本中每一对相应的字符,,如果不匹配,模式向右移一格,再进行下一轮的尝试. 这样尝试的最大次数为n-m+1次,模式进行m次比较,这样比较次数一共是m(n-m+1)=O(nm),次,对于随机的自然文本,它的平均效率为O(n+m) 使用输入增强的思想:对模式进行预处理以得到它的一些信息,把这些信息储存在表中,然后在给定文本中实际查找模式时使用这些信息. 以下是这种思维下的两种算法: 一.H