程式設計之美3 1 字串移位包含問題

2021-06-26 10:40:40 字數 2547 閱讀 2585

這道題目的意思是給定乙個字串,作為源字串,之後給出其他的字串,確定源字串是否能夠經過旋轉而得到給定的字串,即移位包含問題。

假如,給定乙個字串 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(inti =0; i != len1; ++i)

}

}

returnfalse;

}

程式設計之美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進行迴圈移位,再進行字串包含的判斷,從而遍歷其所有的可...