链接:1668. 最大重复子字符串 - 力扣(LeetCode)
大致的意思就是从 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;
}