問題:給定兩個字串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的長度。
#includeusingstrstr函式的內部**是這樣的:namespace
std;
/*strstr函式說明
包含檔案:string.h
函式名: strstr
函式原型:extern char *strstr(char *str1, char *str2);
功能:從字串str1中查詢是否有字串str2,如果有,從str1中的str2位置起,返回str1中str2起始位置的指標,如果沒有,返回null。
返回值:返回該位置的指標,如找不到,返回空指標。
*/int rotate_conbine(char *src,char *dec)
src[len-1]=tmp;
if(strstr(src,dec)!=null)
return1;
}return0;
}int
main()
char *strstr( const解法二:我們也可以對迴圈移位之後的結果進行分析。char *s1, const
char *s2 )
return
null;
}
以s1 = abcd為例,先分析對s1進行迴圈移位之後的結果,如下所示:
abcd--->bcda---->cdab---->dabc---->abcd……
假設我們把前面的移走的資料進行保留,會發現有如下的規律:
abcd--->abcda---->abcdab---->abcdabc---->abcdabcd……
因此,可以看出對s1做迴圈移位所得到的字串都將是字串s1s1的子字串。如果s2可以由s1迴圈移位得到,那麼s2一定在s1s1上,這樣時間複雜度就降低了。
#includeusing解法三:我們的想法是,在s1後面"虛擬"地接上乙個s1,這個"虛擬的s1"並不佔空間,但是仍然按照解法2的思路進行。那麼,如何實現這個"虛擬的s1"呢?其實只要把s1的最後乙個元素,再指回s1的第乙個元素即可。這可以用取模運算實現。比如,元素s1[(d1+i) mod d1]其實就是那個「虛擬的s1」的第i個元素,這裡 0<=i<=d1-1, d1是字串s1的長度。namespace
std;
int rotate_conbine(string src,string
des)
return1;
}/*int doubel_src_conbine(char *src, char *des)
s = src;
while(*s != '\0')
p++;
*p = '\0';
if(strstr(temp, des) != null)
return 1;
else
return 0;
} */
intmain()
同理,指標也可以實現類似功能:
#includeusing解法三的優點:namespace
std;
int ptr_contain(char *src, char *des)
}if(*r == '\0'
)
return1;
}return0;
}int
main()
1. 字串長度較大時,效率依然較好;
2.不需要申請額外空間儲存第二個s1
字串移位包含問題
問題描述 給定兩個字串s1和s2,要求判定s2是否能夠被s1做迴圈移動得到的字串包含。如s1 aabcd和s2 cdaa,則s1迴圈移動後包含s2,返回true s1 abcd和s2 acbd,則s1迴圈移動後不包含s2,返回false 解題思路 1 可以發現,s1迴圈移動後的結果肯定包含在字串s1...
字串移位包含問題
本問題 於 程式設計之美 問題描述 給定兩個字串s1和s2,要求判定s2是否能夠被通過s1做迴圈移位 rotate 得到的字串包含。例如,給定s1 aabcd和s2 cdaa,返回true 給定s1 abcd和s2 acbd,返回false。下面有兩種解法,第一種是列舉法 第二種是用了一種技巧,實現...
字串移位包含的問題
字串移位包含的問題 給定兩個字串s1和s2,要求判斷s2是否能夠被s1做迴圈移位得到的字串包含,例如,給定s1 aabcd和s2 cdaa,返回true 給定s1 abcd和s2 acbd,返回false 在做這道題的時候我發現了乙個很容易出錯,但是去不容易找到原因。主要原因是我們對於全變數初始化位...