持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
一、题目描述:
给你一个字符串 sequence ,如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串,那么单词 word 的 重复值为 k 。单词 word 的 最大重复值 是单词 word 在 sequence 中最大的重复值。如果 word 不是 sequence 的子串,那么重复值 k 为 0 。
给你一个字符串 sequence 和 word ,请你返回 最大重复值 k 。
示例 1:
输入:sequence = "ababc", word = "ab" 输出:2 解释:"abab" 是 "ababc" 的子字符串。 示例 2:
输入:sequence = "ababc", word = "ba" 输出:1 解释:"ba" 是 "ababc" 的子字符串,但 "baba" 不是 "ababc" 的子字符串。 示例 3:
输入:sequence = "ababc", word = "ac" 输出:0 解释:"ac" 不是 "ababc" 的子字符串。
提示:
1 <= sequence.length <= 100 1 <= word.length <= 100 sequence 和 word 都只包含小写英文字母。
二、思路分析:
如果目标串的长度大于序列长度,显然不能满足要求
使用cnt记录当前连续重复子串的个数,res记录cnt的最大值
从序列开头开始遍历,如果从当前位置开始的子串和给定的目标串相同,那么将指针向前移动word.size(),并将当前计数加一
如果下一个子串不满足要求,那么将指针回退word.size()-1个位置,重新开始判断,直到结束遍历
三、AC 代码:
func maxRepeating(sequence string, word string) int {
// 计算当前最大重复
k := 0
for si:=0; si<len(sequence) - k*len(word); si++ {
// seq的每个字符作为起始定位,sicur是当前循环seq的相对索引到的位置
// tmp标记当前循环找到的最大重复次数
tmp:=0
sicur := si
wj := 0
for wj <len(word) && sicur < len(sequence) {
// 不想等直接结束本次循环
if sequence[sicur] != word[wj] {
break
}
// word结束了,找到一次重复,继续找下一个重复
// 还没结束则word继续下一个字符匹配
if wj == len(word) - 1{
wj = 0
tmp ++
} else {
wj++
}
// 每次循环结束都递增seq的索引
sicur++
}
if tmp > k {
k = tmp
}
}
return k
}