459. 重复的子字符串

目录

459. 重复的子字符串

easy

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

1
2
3
输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。

枚举

https://markdown-1303167219.cos.ap-shanghai.myqcloud.com/image-20220314204654222.png

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
func repeatedSubstringPattern(s string) bool {
	for i := 1; i <= len(s)/2; i++ {
		// i代表长度
		if len(s)%i == 0 {
			// 长度整除
			isMatch := true
			for j := i; j < len(s); j++ {
				// 判断之后的字符串是否可以由0到i-1的子串构成
				if s[j] != s[j-i] {
					isMatch = false
					break
				}
			}
			if isMatch {
				return true
			}
		}
	}
	return false
}

KMP

https://markdown-1303167219.cos.ap-shanghai.myqcloud.com/image-20220314212251267.png

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
func getNext(s string) []int {
	next := make([]int, len(s)) // 0-i子串的最长公共前后缀
	next[0] = 0
	i := 0 // i指向前缀
	for j := 1; j < len(s); j++ {
		// j指向后缀
		for i > 0 && s[i] != s[j] {
			i = next[i-1]
		}
		if s[i] == s[j] {
			i++
		}
		next[j] = i
	}
	return next
}

func repeatedSubstringPattern(s string) bool {
	if len(s) == 0 {
		return false
	}
	next := getNext(s)
	if next[len(s)-1] != 0 && len(s)%(len(s)-next[len(s)-1]) == 0 {
		return true
	}
	return false
}