最大重复子字符串

给你一个字符串 sequence ,如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串,那么单词 word重复值为 k 。单词 word 大重复值 是单词 wordsequence 中最大的重复值。如果 word 不是 sequence 的子串,那么重复值 k0

给你一个字符串 sequenceword ,请你返回 最大重复值 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" 的子字符串
cpp 复制代码
class Solution {
public:
    int maxRepeating(string sequence, string word) {
        // 边界条件:如果word长度大于sequence,不可能有匹配,直接返回0
        if(word.size() > sequence.size())
            return 0;
        
        int i = 0;          // sequence中当前匹配的起始索引
        int k = 0;          // 记录最大连续重复次数(最终结果)
        int a = 0;          // 记录当前连续匹配的次数
        
        // 循环条件:确保从i开始有足够长度匹配word
        while(i <= sequence.size() - word.size()) {
            int pos = i;    // 保存当前起始位置,用于偏移计算
            int j = 0;      // word中当前匹配的字符索引
            
            // 尝试匹配word的每个字符
            while(j < word.size()) {
                // 若字符匹配,继续检查下一个字符
                if(sequence[pos + j] == word[j]) {
                    j++;  // 移动到word的下一个字符
                    
                    // 当完整匹配一次word时
                    if(j == word.size()) {
                        a++;  // 当前连续匹配次数+1
                        k = max(k, a);  // 更新最大连续次数
                        i = i + word.size();  // 起始位置后移word长度,继续检查下一次连续匹配
                    }
                } else {
                    // 匹配失败时:
                    // 1. 回退到本次连续匹配开始位置的下一个字符
                    // (减去已匹配的总长度,再加1)
                    i = i - (a * word.size()) + 1;
                    a = 0;  // 重置当前连续匹配次数
                    break;  // 退出当前word的匹配循环
                }
            }
        }
        
        return k;  // 返回最大连续重复次数
    }
};
相关推荐
To_OC2 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC2 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
To_OC3 天前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
To_OC3 天前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC4 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
To_OC6 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
To_OC7 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
想吃火锅100513 天前
【leetcode】121.买卖股票的最佳时机js/c++
算法·leetcode·职场和发展
凌波粒13 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
退休倒计时13 天前
【每日一题】LeetCode 146. LRU 缓存 TypeScript
算法·leetcode·缓存·typescript