1668. 最大重复子字符串

48 阅读2分钟

链接:leetcode.cn/problems/ma…

题目

大致的意思就是从 sequence 中是否出现一个子串等于 word的,如果没有输出 0,如果有,输出他连续最大重复的数量

比如:

  • sequence = "ababc",word = "d",返回 0,因为 sequence 没有子串等于 "d"
  • sequence = "abadbc",word = "ab",返回 1,因为sequence 出现子串 "ab",最大连续重复次数为 1
  • sequence = "ababc",word = "ab",返回 2,因为sequence 出现子串 "abab",最大连续重复次数为 2

思路

最简单的方法就是将 sequence 进行遍历,与 word 的第一个字符先进行匹配,如果符合就对接下来的字符与 word继续匹配,如果不符合就继续遍历 sequence

代码

/**
 * 0 ms 击败 100.00% 消耗内存分布 40.83 MB 击败 92.31%
 */
public int maxRepeating(String sequence, String word) {
    // 将 sequence 转换为 char 数组
    char[] sequenceArray = sequence.toCharArray();
    // 将 word 转换为 char 数组
    char[] wordArray = word.toCharArray();
    // 初始化计数器
    int maxCount = 0;
    // 遍历 sequence 数组
    for (int i = 0; i < sequenceArray.length; i++) {
        // 判断 sequenceArray[i] 是否与 wordArray[0] 相等
        if (sequenceArray[i] == wordArray[0]){
            // 用来保存局部的计数
            int count = 0;
            // 用来保存遍历的开始坐标
            int sequenceArrayIndex = i;
            while (true) {
                // 判断 sequenceArray 从 sequenceArrayIndex 开始的字符数组 与 wordArray 是否匹配
                boolean flag = process(sequenceArray, wordArray, sequenceArrayIndex);
                // 说明从 sequenceArrayIndex 开始的字符数组 与 wordArray 不匹配
                if (!flag) {
                    break;
                }
                // 如果匹配,说明已经遍历完整个 wordArray,然后进行再次匹配
                sequenceArrayIndex = sequenceArrayIndex + wordArray.length;
                count++;
            }
            // 取最大计数
            maxCount = Math.max(maxCount, count);
        }
    }
    return maxCount;
}

/**
 * 判断从 sequenceIndex下标 开始对 sequenceArray 以及 wordArray 进行匹配,是否满足
 *  sequenceIndex 开始的 wordArray 长度的字符 与 wordArray 完全匹配
 * @param sequenceArray sequence 的字符数组
 * @param wordArray word 的字符数组
 * @param sequenceIndex sequenceArray 开始的下标
 * @return true 表示完全匹配,false 表示不匹配
 */
public boolean process(char[] sequenceArray, char[] wordArray, int sequenceIndex) {
    int wordIndex = 0;
    // 循环直到 wordArray 遍历完成
    while (wordIndex < wordArray.length) {
        // false 条件:sequenceArray 遍历完成  或者  sequenceArray 和 wordArray 的字符对应不上
        if (sequenceIndex >= sequenceArray.length || sequenceArray[sequenceIndex++] != wordArray[wordIndex++]){
            return false;
        }
    }
    return true;
}