標籤:圖片 ref namespace cin 知識 字串匹配演算法 word 開始 語言
字串匹配是資料庫開發和文文書處理軟體的關鍵。幸運的是所有現代程式設計語言和字串庫函數,協助我們的日常工作。不過理解他們的原理還是比較重要的。
字串演算法主要可以分為幾類。字串匹配就是其中之一。當我們提到字串匹配演算法,最基本的方法就是所謂的蠻力解法,這意味著我們需要檢查每一個文本串中的字元是否和匹配串相匹配。一般來說我們有文本串和一個匹配串(通常匹配串短於文本串)。我們需要做的就是回答這個匹配串是否出現在文本串中。
概述
字串蠻力匹配法的原理非常簡單。我們必須檢查匹配串的第一個字元與文本串的第一個字元是否相匹配,就如片所述。
我們通過比較文本串的和匹配串的第一個字元來開始
如果他們不匹配我們移向文本串的第二個字元。現在我們比較匹配串的第一個字元和文本串第二個字元。如果他們不匹配我們繼續向前移動,直到我們遇到一個相匹配的或直到我們到達文本串的最後。
因為文本串第一個字元和匹配串的第一個字元不匹配,我們向前移動到文本串的的第二個字元。現在我們比較文本串的第二個字元和匹配串的第一個字元!
假設第一個字元匹配,我們移向匹配串的第二個字元去和文本串的下一個字元比較。如下面圖片所示。
如果文本串的一個字元和匹配串的第一個字元相匹配,我們向前移動到匹配串第二個字元和文本串的下一個字元做匹配
如果僅僅是因為匹配串的第一個字元與文本串的某個字元相匹配,那並不意味著這個匹配串出現在文本串中,也僅僅是第一個字元出現在文本串中,其他說明不了。我們必須向前移動匹配串,看看完整的匹配串是否包含在文本文本串中。
#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;
}
//註:兩種方法的實現的方法都是一模一樣的唯一不同是在於對字串的處理方面。
蠻力法 字串匹配