字符串匹配是数据库开发和文字处理软件的关键。幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作。不过理解他们的原理还是比较重要的。
字符串算法主要可以分为几类。字符串匹配就是其中之一。当我们提到字符串匹配算法,最基本的方法就是所谓的蛮力解法,这意味着我们需要检查每一个文本串中的字符是否和匹配串相匹配。一般来说我们有文本串和一个匹配串(通常匹配串短于文本串)。我们需要做的就是回答这个匹配串是否出现在文本串中。
概述
字符串蛮力匹配法的原理非常简单。我们必须检查匹配串的第一个字符与文本串的第一个字符是否相匹配,就如下图片所述。
我们通过比较文本串的和匹配串的第一个字符来开始
如果他们不匹配我们移向文本串的第二个字符。现在我们比较匹配串的第一个字符和文本串第二个字符。如果他们不匹配我们继续向前移动,直到我们遇到一个相匹配的或直到我们到达文本串的最后。
因为文本串第一个字符和匹配串的第一个字符不匹配,我们向前移动到文本串的的第二个字符。现在我们比较文本串的第二个字符和匹配串的第一个字符!
假设第一个字符匹配,我们移向匹配串的第二个字符去和文本串的下一个字符比较。如下面图片所示。
如果文本串的一个字符和匹配串的第一个字符相匹配,我们向前移动到匹配串第二个字符和文本串的下一个字符做匹配
如果仅仅是因为匹配串的第一个字符与文本串的某个字符相匹配,那并不意味着这个匹配串出现在文本串中,也仅仅是第一个字符出现在文本串中,其他说明不了。我们必须向前移动匹配串,看看完整的匹配串是否包含在文本文本串中。
#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
/*int main()
{
int n;
cin>>n;
vector<char>A(n);
for(int i=0;i<n;i++)
{
cin>>A[i];
}
int m;
cin>>m;
vector<char>B(m);
for(int i=0;i<m;i++)
{
cin>>B[i];
}
int j;
for(int i=0;i<n-m;i++)
{
j=0;
while(j<m&&B[j]==A[i+j])
{
j++;
if(j==m)
{
cout<< i<<endl;
}
cout<< -1<<endl;
}
}
return 0;
}*/
//注:以上是来自课本的实现方法,由于本人自己对这原理虽然有一定理解但实现还是有一定的瑕疵,所以参照了网上的解法
int BruceForceStringmatch(string text,string pattern)
{
//分别得到文本和模式的长度
int n=text.size();
int m=pattern.size();
//开始蛮力字符匹配
for(int i=0;i<n-m;i++)
{
int j=0;
while(j<m&&text[i+j]==pattern[j])
{
j++;
}
if(j==m)
{
return i;
}
}
return -1;
}
int main()
{
string text("hello world!");
string pattern("o wo");
int result=BruceForceStringmatch(text,pattern);
cout<<result<<endl;
return 0;
}
//注:两种方法的实现的方法都是一模一样的唯一不同是在于对字符串的处理方面。