這道題目的意思是給定乙個字串,作為源字串,之後給出其他的字串,確定源字串是否能夠經過旋轉而得到給定的字串,即移位包含問題。
假如,給定乙個字串 abcdefg,接著給定字串 cdefgab,很顯然,給定的字串是可以經過源字串旋轉而得到的,但是,給定字串 cdegfab 就不能由源字串經過旋轉而得到。
當然,這道題有很多解法,我們可以經過判斷字串中字元的位置而得到答案,但是,那樣做確實是太麻煩了,有更好的解法嗎?當然,我們看下兩個字串的規律,當把源字串 * 2 時,即拼接在一塊,只要是給定字串能經過源字串旋轉而得到,那麼,給定的字串一定在源字串 * 2中。例如,前面的例子,把源字串 * 2 ,可以得到的字串是 abcdefgabcdefg,我們可以看到,給定的字串確實是出現在其中的。
好了,有了上述思想,我們可以利用 strstr 函式求解這個問題了,strstr 函式是返回目的字串出現在源字串的位置,如果返回 null,那麼就不存在,即不能經過源字串旋轉而得到。
函式宣告:
?
1bool dutshiftcontains_1(
char
*,
char
*);
源**:
?
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool dutshiftcontains_1(
char
* str1,
char
* str2)
現在,我們來思考書後的擴充套件,即不申請別的空間,能求解這個問題嗎?因為,需要拼接字串自然需要申請更多的空間。
答案是:可以。我們虛擬的來做,即當達到源字串的末尾時,從源字串的開頭處比對不就行了嗎。當然,這就是取餘的方法了。
函式宣告:
?
1bool dutshiftcontains_2(
char
*,
char
*);
源**:
?
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
bool dutshiftcontains_2(
char
* str1,
char
* str2)
/*模擬拼接處理*/
for
(
int
i =
0
; i != len1; ++i)
}
}
return
false
;
}
程式設計之美3 1 字串移位包含問題
程式設計之美3.1 字串移位包含問題。判斷s2能否被s1做迴圈移位得到的字串包含,若直接判斷效率較低。可以將s1s1連線起來,如果s2可以通過迴圈移位得到,則s2一定是s1s1的子串,可以通過呼叫strstr得到。時間複雜度o n m 不過strstr的實現效率較低,可以使用kmp判斷是否是子串。每...
程式設計之美3 1 字串移位包含問題
這道題目的意思是給定乙個字串,作為源字串,之後給出其他的字串,確定源字串是否能夠經過旋轉而得到給定的字串,即移位包含問題。假如,給定乙個字串 abcdefg,接著給定字串 cdefgab,很顯然,給定的字串是可以經過源字串旋轉而得到的,但是,給定字串 cdegfab 就不能由源字串經過旋轉而得到。當...
《程式設計之美》3 1 字串移位包含的問題
問題 給定兩個字串s1和s2,要求判定s2是否能夠被s1做迴圈移位 rotate 得到的字串包含。例如,給定s1 aabcd 和 s2 cdaa 返回true 給定s1 abcd 和 s2 acbd,返回false.解法一 使用最直接的方法對s1進行迴圈移位,再進行字串包含的判斷,從而遍歷其所有的可...