題目要求:給定一個非空的字符串,判斷它是否可以由它的一個子串重復多次構成。給定的字符串只含有小寫英文字母,并且長度不超過10000。
思路:
一、首先對于暴力解法,可以枚舉所有的字串進行判斷。但是枚舉時實際上只需要一次for循環遍歷終止位置(每次一定從頭開始),而不需要一個for循環獲取起始位置,一個for循環獲取終止位置,而且不用遍歷到結束,字串結束位置大于中間位置一定不能組成重復字符串。
二、移動匹配方法。如果一個字符串s內部由重復的子串組成,那么兩個s組成的新字符串中如果中間還能出現一個s,則說明時重復子串組成。但是兩個s拼接后我們要刪除此字符串的首首尾字符,這樣能確保搜索出的s一定是拼接出來的。(代碼中find庫函數實現為O(m+n))
三、KMP算法。在由重復子串組成的字符串中,最長相等前后綴不包含的子串就是最小重復子串!!!(此處可以自己畫圖驗證)
leetcode實戰:
代碼實現: