链接:https://leetcode.cn/problems/maximum-repeating-substring/
题目
大致的意思就是从 sequence
中是否出现一个子串等于 word
的,如果没有输出 0,如果有,输出他连续最大重复的数量
比如:
sequence
= "ababc",word
= "d",返回 0,因为sequence
没有子串等于 "d"sequence
= "abadbc",word
= "ab",返回 1,因为sequence
出现子串 "ab",最大连续重复次数为 1sequence
= "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; }