字串移位包含的問題

2021-09-06 11:40:09 字數 2160 閱讀 7820

問題:給定兩個字串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的長度。

#includeusing

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()

strstr函式的內部**是這樣的:

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

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()

解法三:我們的想法是,在s1後面"虛擬"地接上乙個s1,這個"虛擬的s1"並不佔空間,但是仍然按照解法2的思路進行。那麼,如何實現這個"虛擬的s1"呢?其實只要把s1的最後乙個元素,再指回s1的第乙個元素即可。這可以用取模運算實現。比如,元素s1[(d1+i) mod d1]其實就是那個「虛擬的s1」的第i個元素,這裡 0<=i<=d1-1, d1是字串s1的長度。

同理,指標也可以實現類似功能:

#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 在做這道題的時候我發現了乙個很容易出錯,但是去不容易找到原因。主要原因是我們對於全變數初始化位...