【力扣】459. 重複的子字串
阿新 • • 發佈:2020-08-24
給定一個非空的字串,判斷它是否可以由它的一個子串重複多次構成。給定的字串只含有小寫英文字母,並且長度不超過10000。
示例 1:
輸入: "abab"
輸出: True
解釋: 可由子字串 "ab" 重複兩次構成。
示例 2:輸入: "aba"
輸出: False
示例 3:輸入: "abcabcabcabc"
輸出: True
解釋: 可由子字串 "abc" 重複四次構成。 (或者子字串 "abcabc" 重複兩次構成。)
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/repeated-substring-pattern
時間複雜度:O(n^2) 空間複雜度O(1)
public boolean repeatedSubstringPattern(String s) { //如果這個字串的長度為奇數,那麼說明只有奇數長度的子串才有可能拼裝 //如果為偶數,則不限 //由上述可得, 我們能夠根據字串一半來檢視是否能夠由子串構成 // 子串的長度 可以被s的長度整除 int n = s.length(); for(int i = 1;i*2 <=n; i++){ //// 子串的長度 可以被s的長度整除 ,如果不能被整除,說明無法構成s ,這裡i代表子串的長度if(n%i == 0){ boolean isMatch = true; //從j到n迴圈,知道了子串的長度為n,所以,可以使用從0開始的n跟當前從j開始的子串進行對比,如果字元不匹配,則不是重複子串。 for(int j =i ; j < n;j++){ if(s.charAt(j) != s.charAt(j- i)){ isMatch = false;break; } } if(isMatch){ return true; } } } return false; }
方法二:字串匹配
public boolean repeatedSubstringPattern(String s) { return (s + s).indexOf(s, 1) != s.length(); }
這種演算法十分簡單,弄明白也很簡單
比如 abcabc ,那麼"abcabcabcabc".indexOf("abcabc",1) 就是 3
也就是 s字串,可以由 s1 及 s2的後一部分和前一部分構成,如果無法構成,就是沒有重複子串的;另外就是結果值不能為s的長度。