给你一个字符串 sequence ,如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串,那么单词 word 的 重复值为 k 。单词 word 的 最大重复值 是单词 word 在 sequence 中最大的重复值。如果 word 不是 sequence 的子串,那么重复值 k 为 0 。给你一个字符串 sequence 和 word ,请你返回 最大重复值 k 。
1 | 示例 1: |
左右遍历
- 从左往右计算连续重复的字符串的数量
- 从右往左计算连续重复的字符串的数量
- 计算最大值
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61class Solution {
public int maxRepeating(String sequence, String word) {
char[] sq = sequence.toCharArray();
int n = sequence.length();
int len = word.length();
int res = 0;
int max = 0;
boolean lastFlag = false;
// 从左往右统计重复的word的数量
for (int i = 0; i < sq.length; i++) {
int c = 0;
int index = i;
// 从前往后判断是否与word相同
for (int j = 0; j < word.length(); j++) {
index = i + j;
if (index < n && word.charAt(j) == sq[index]) c++;
else break;
}
i = index;
if (c == len) {
lastFlag = true;
res++;
max = Math.max(max, res);
} else {
lastFlag = false;
max = Math.max(res, max);
res = 0;
}
}
lastFlag = false;
res = 0;
// 从右往左统计word的数量
for (int i = sq.length - 1; i >= 0; i--) {
int c = 0;
boolean flag = false;
// 从后往前判断是否与word相同
for (int j = word.length() - 1; j >= 0; j--) {
if (i > -1 && word.charAt(j) == sq[i]) {
i--;
c++;
flag = true;
} else break;
}
// 上面多减了1,再加回来
if (flag) i++;
if (c == len) {
lastFlag = true;
res++;
max = Math.max(max, res);
} else {
lastFlag = false;
max = Math.max(res, max);
res = 0;
}
}
return max;
}
}
反向思考(从复制word入手)
复制word,判断sequence中是否包含word的复制字符串
1 | class Solution { |