C++实现字符串匹配的暴力法

实验报告

  (系)    班级      学号         姓名       

实验日期                                            指导老师      

实验名称    字符串匹配的蛮力实现   

实验目的   编写算法程序解决上述问题   

实验步骤(实验内容、写出代码和运行结果)

题目:

字符串算法主要可以分为几类。字符串匹配就是其中之一。当我们提到字符串匹配算法,最基本的方法就是所谓的蛮力解法,这意味着我们需要检查每一个文本串中的字符是否和匹配串相匹配。一般来说我们有文本串和一个匹配串(通常匹配串短于文本串)。我们需要做的就是回答这个匹配串是否出现在文本串中。要求用蛮力算法解决字符串的匹配问题。

代码实现:

#include<stdio.h>

#include <iostream>

using namespace std;

int i,j;

int a[100]={};

int m,n;

int p=0,k=1;

int f(string text,string pattern)

{

     m = text.size();

     n = pattern.size();

    

    for(i=0;i<=m-n;++i)

  {

         j=0;

        while(j<n&&text[i+j]==pattern[j])

{

            j++;

        }

        

        if(j==n)

{

            a[i]=1;

            p++;

        }

      }

    return 0;

}

int main(){

    string text;

    string pattern;

    cin>>text;

cin>>pattern;

    f(text,pattern);

    if(p==0)

    {

     cout<<"不存在一致的字符串"<<endl;

}

    else

    {

     cout<<"有"<<p<<"个一致的字符串,分别为:"<<endl;

     for(i=0;i<=m-n;i++)

     {

     if(a[i]==1)

     {

      cout<<"第"<<k<<"个一致字符串下标首位置是第"<<i+1<<"个字母"<<endl;

 k++;

}

    

}

    

}

    

    

    return 0;

}

运行结果:

实验总结体会(主要书写:上机过程碰到的问题,自己如何解决的,还有哪些疑问,对本次上机进行认真总结,自己的体会)

字符串匹配蛮力算法最关键一步就是要在小字符串判断完成后回到原来遍历位置的下一位,否则就会漏掉。总体来说,用蛮力法来解决字符串的匹配问题思路还是很清晰的,算法也不是很难,不过遇到数量级很大的文章和字符串的时候估计运算速度会很慢。

  • 26
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
常见的字符串匹配算法暴力匹配、KMP算法、Boyer-Moore算法等。 暴力匹配算法思路比较简单,就是从文本串的第一个字符开始,依次与模式串的每个字符进行比较,如果每个字符都相同,则匹配成功;否则继续在文本串中向右移动一个字符,再进行比较,直到匹配成功或者文本串中没有足够的字符与模式串进行比较。 C++实现暴力匹配算法的代码如下: ```c++ #include <iostream> #include <cstring> using namespace std; int brute_force(string text, string pattern) { int n = text.size(); int m = pattern.size(); for (int i = 0; i <= n - m; i++) { bool match = true; for (int j = 0; j < m; j++) { if (text[i + j] != pattern[j]) { match = false; break; } } if (match) { return i; } } return -1; } int main() { string text = "hello world"; string pattern = "world"; int pos = brute_force(text, pattern); if (pos == -1) { cout << "pattern not found" << endl; } else { cout << "pattern found at position " << pos << endl; } return 0; } ``` 这里使用了两个指针 `i` 和 `j` 分别指向文本串和模式串中正在比较的字符。如果当前字符匹配成功,则两个指针都向右移动一位,否则文本串指针向右移动一位,模式串指针回到开头重新开始匹配。 暴力匹配算法的时间复杂度为 $O(mn)$,其中 $m$ 是模式串长度,$n$ 是文本串长度。在最坏情况下,需要比较 $mn$ 次,因此当模式串比较长时,暴力匹配算法的效率会比较低。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaojiwazi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值