編程之美之字符串移位包含問題
【題目】
給定兩個字符串s1和s2,要求判斷s2是否能夠被通過s1做循環移位(rotate)得到的字符串包含。例如,S1=AABCD和s2=CDAA,返回true;給定s1=ABCD和s2=ACBD,返回false。
【分析】
【思路一】
從題目中可以看出,我們可以使用最直接的方法對S1進行循環移動,再進行字符串包含的判斷,從而遍曆其所有的可能性。
字符串循環移動,時間複雜度為O(n),字符串包含判斷,采用普通的方法,時間複雜度為O(n*m),總體複雜度為O(n*n*m)。
字符串包含判斷,若采用KMP算法,時間複雜度為O(n),這樣總體的複雜度為O(n*n)。若字符串的長度n較大,顯然效率比較低。其中n為S1的長度,m為S2的長度。
【思路二】
我們也可以對循環移位之後的結果進行分析。
以S1 = ABCD為例,先分析對S1進行循環移位之後的結果,如下所示:
ABCD--->BCDA---->CDAB---->DABC---->ABCD……
假設我們把前麵的移走的數據進行保留,會發現有如下的規律:
ABCD--->ABCDA---->ABCDAB---->ABCDABC---->ABCDABCD……
因此,可以看出對S1做循環移位所得到的字符串都將是字符串S1S1的子字符串。如果S2可以由S1循環移位得到,那麼S2一定在S1S1上,這樣時間複雜度就降低了。
【代碼一】
/*********************************
* 日期:2014-5-15
* 作者:SJF0115
* 題號: 字符串移位包含問題
* 來源:編程之美
**********************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
bool IsRotate(char* str1,char* str2){
int i,j;
if(str1 == NULL || str2 == NULL){
return false;
}
int len = strlen(str1);
//循環移位
for(i = 0;i < len;i++){
char temp = str1[0];
//移動一位
for(j = 1;j < len;j++){
str1[j-1] = str1[j];
}
str1[len-1] = temp;
//判斷str1中是否包含str2
if(strstr(str1,str2) != 0){
return true;
}
}
return false;
}
int main(){
char str1[6] = "AABCD";
char str2[5] = "CDAA";
bool result = IsRotate(str1,str2);
cout<<result<<endl;
return 0;
}
【代碼二】
/*********************************
* 日期:2014-5-15
* 作者:SJF0115
* 題號: 字符串移位包含問題
* 來源:編程之美
**********************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
bool IsRotate(char* str1,char* str2){
int i,j;
if(str1 == NULL || str2 == NULL){
return false;
}
int len1 = strlen(str1);
char* str3 = new char(len1*2+1);
strcpy(str3,str1);
strcat(str3,str1);
//str3 = str1+str1
if(strstr(str3,str2) != 0){
return true;
}
return false;
}
int main(){
char str1[6] = "AABCD";
char str2[5] = "CDAA";
bool result = IsRotate(str1,str2);
cout<<result<<endl;
return 0;
}
最後更新:2017-04-03 12:56:39
上一篇:
[Cocos2d-x v3.x]序列幀動畫
下一篇:
ubuntu 14.04中安裝Jenkins
py2exe 打包 Pmw Error 3 解決方案
潛在殺人凶器?VR設備、無人機、平衡車的死穴在“聲音”!
'System.Data.DataRow.DataRow(System.Data.DataRowBuilder)' is inaccessible due to its protection leve
物流頻掐架 折射大數據之爭
作為程序猿,你還記得你碰到過哪些奇葩的BUG?
android電源添加重啟項
LinearLayout 垂直滾動
一個Java 8中簡單Lambda表達式程序
Java中vector理解2——vector和arrayList的區別
android-plugmgr源代碼分析