LeetCode-459-重複的子字串

雄獅虎豹 發表於 2022-05-06
LeetCode

重複的子字串

題目描述:給定一個非空的字串,判斷它是否可以由它的一個子串重複多次構成。給定的字串只含有小寫英文字母,並且長度不超過10000。

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:字串遍歷

首先,判斷特殊情況,當該字串只有一個字元時,不可能由子串重複構成,所以直接返回false;

否則,分別遍歷子串的長度從1~原字串長度的一半,然後迴圈判斷:

  • 如果當前子串的長度不能被原字串的長度模除結果為0,說明這個子串不可能多次重複構造成原字串,直接跳過;
  • 獲取當前要判斷的子串;
  • 根據原字串的長度獲得當前子串需要重複多少次才能構成原字串;
  • 遍歷判斷是否可以重複構成原字串,如果可以,直接返回true,否則,繼續判斷下一個子串。

最後,如果沒有子串可以重複多次構成原字串,則返回false。

public class LeetCode_459 {
    public static boolean repeatedSubstringPattern(String s) {
        // 特殊情況,當該字串只有一個字元時,不可能由子串重複構成,所以直接返回false
        if (s.length() == 1) {
            return false;
        }
        // 記錄原字串的長度
        int len = s.length();
        // 分別遍歷子串的長度從1~原字串長度的一半
        for (int i = 1; i <= len / 2; i++) {
            // 如果當前子串的長度不能被原字串的長度模除結果為0,說明這個子串不可能多次重複構造成原字串,直接跳過
            if (len % i != 0) {
                continue;
            }
            // 獲取當前要判斷的子串
            String repeatSubStr = s.substring(0, i);
            boolean allRepeat = true;
            // 當前子串需要重複多少次才能構成原字串
            int count = len / i;
            // 遍歷判斷是否可以重複構成原字串
            for (int j = 1; j < count; j++) {
                if (!s.substring(j * i, (j + 1) * i).equals(repeatSubStr)) {
                    allRepeat = false;
                    break;
                }
            }
            if (allRepeat) {
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        // 測試用例,期望輸出: true
        System.out.println(repeatedSubstringPattern("abab"));
    }
}
【每日寄語】 挫折是一塊石頭,對於弱者來說它是拌腳石,讓你停步不前。而對於強者來說它是墊腳石,使你站得更高。