多益機試題目 字串匹配的變形

2021-06-22 00:12:06 字數 2283 閱讀 5939

多益一道機試題目,共有3道,這應該算是最難的一道了。題目如下:

現有字串str1和str2,如果str1通過移位,可以包含str2,那麼就說str1包含str2,否則不包含。要求盡可能高效。

輸入:str1和str2。

輸入:如果包含則輸出yes,否則輸出no。

例如:abcdef包含fa(移位後包含,例如可以變為fabcde),而abcdef不包含ffa。

我想這道題目應該主要想考察kmp或bm演算法,雖然了解,但是當時不能上網,我也不能保證可以寫對,就直接暴力求解了。多益給的開發環境是vs2005,這樣的匹配查詢也有對應的庫函式,可是記不住,vs2005提示的庫函式中,我有沒找到。

思路分析:一起見到的題目都是字串匹配,沒有移位。加上移位,需要變通一下,最簡單的是暴力求解,每移位一次,匹配一次,直到窮盡移位。

移位過程中,字母左右兩邊挨著的字母不變(認為第乙個和最後乙個是挨著的),而字串匹配,匹配過程中也是挨個匹配。這樣想的話,我們可以把母串首位相接,這就包含了所有移位的情況。如果母串首位相接(母串=母串+母串)後包含子串,那麼就包含子串(前提是母串長度不小於子串,首位相接會使母串長度加倍)。

解法1:用c++庫函式

先看一下這個庫函式

int find(const string &s, int pos = 0) const;//從pos開始查詢字串s在當前串中的位置,查詢失敗返回-1

。#include#includeusing namespace std;

int main()

{ string str1;

string str2;

cin>>str1>>str2;

if(str1.length()>=str2.length())//母串不能短於子串

{ str1=str1+str1;

int pos=str1.find(str2);

if(pos!=-1)

cout<<"yes"《解法2:kmp演算法。

我想多益考察

的應該不是怎麼用

這個庫函式吧!「盡可能高效」也提示我們要用高效演算法。下面給出kmp演算法實現。

其中kmp演算法參考

#include#includeusing namespace std;

//求kmp的next陣列

void getnext(const char *p,int *next)

{ int len=strlen(p);

int i=0;

int j=-1;

next[i]=j;

while(i>str1>>str2;

if(str1.length()>=str2.length())//母串不能短於子串

{ str1=str1+str1;

const char *s1=str1.c_str();

const char *s2=str2.c_str();

int pos=kmpsearch(s1,s2);

if(pos!=-1)

cout<<"yes"壞字元相對比較簡單,如果不包含壞字元,則移動length距離,否則壞字元與匹配串最右邊的對應字元對其。

初始化壞字元移動距離如下:

/*p為匹配子串,bmbc為壞字符集

*/void getbmbc(const char *p,int bmbc)

{ int len=strlen(p);

for(int i=0;i<256;i++)//初始化壞字符集

bmbc[i]=len;

for(int i=0;i

bm好字尾需要的是zbox的變形,zbox是從左向右計算,而bm好字尾需要從後向前(從右向左)。因此在計算zbox前要先反轉匹配子串,計算的zbox值在使用前也要反轉。

計算zbox**如下:

/*zbox匹配演算法

p為字串,len為字串長度,zbox為儲存的值

*/void getzbox(const char *p,int len,int zbox)

{ zbox[0]=len;

int left=0;

int right=0;

for(int i=1;i

但是作者寫的**不全,完整版如下:

/*p匹配子串,bmgc好字尾移動距離儲存,zbox儲存zbox的原始值

*/void getbmgc(const char *p,int bmgc, int zbox)

{ int len=strlen(p);

//先把zbox反轉

int start=0;

int end=len-1;

while(start

字串匹配 北航機試題

讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入有多組資料。每組資料第一行輸入n 1 n 1000 從第二...

華為機試題目 字串替換

題目要求 輸入乙個字串,然後在輸入乙個整數,就是替換字串的次數,然後依次輸入需要替換的字串 例如 輸入 abcdefg 3 a qwe b s fg abc 輸出 qwescdeabc 字串替換 include include include define max 100 using namespa...

字串的變形

這道題很多字串的邊界問題,涉及到空格,反轉的問題。很麻煩,記得以前只做過類似的題,應該有簡單的方法,但沒有找到,以後再看看。就像 hello world 一樣,然後我們要做的是把著個字串中由空格隔開的單詞反序,同時反轉每個字元的大小寫。比如 hello world 變形後就變成了 world hel...