刷题日记 1668. 最大重复子字符串

135 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

一、题目描述:

1668. 最大重复子字符串 - 力扣(LeetCode)

给你一个字符串 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
}

四、参考:

【track & traning】一行代码,思路简单,性能高效 - 最大重复子字符串 - 力扣(LeetCode)