多益一道機試題目,共有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...