重複的子字串
題目描述:給定一個非空的字串,判斷它是否可以由它的一個子串重複多次構成。給定的字串只含有小寫英文字母,並且長度不超過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"));
}
}
【每日寄語】 挫折是一塊石頭,對於弱者來說它是拌腳石,讓你停步不前。而對於強者來說它是墊腳石,使你站得更高。