1. 程式人生 > 實用技巧 >【力扣】459. 重複的子字串

【力扣】459. 重複的子字串

給定一個非空的字串,判斷它是否可以由它的一個子串重複多次構成。給定的字串只含有小寫英文字母,並且長度不超過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的長度。