持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
前言
leetcode的题目有些能给人茅塞顿开,打通任督二脉,并且能在工作中帮助你提升代码逻辑思维,今天我做的一道题是leetcode的一道简单的题,但是实际做起来是有坑的哦。且听我慢慢道来。
题目
1668. 最大重复子字符串 【简单题】有坑!
给你一个字符串 sequence ,如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串,那么单词 word 的 重复值为 k 。单词 word 的 最大重复值 是单词 word 在 sequence 中最大的重复值。如果 word 不是 sequence 的子串,那么重复值 k 为 0 。
给你一个字符串 sequence 和 word ,请你返回 最大重复值 k 。
示例 1: 输入:sequence = "ababc", word = "ab" 输出:2 解释:"abab" 是 "ababc" 的子字符串。
题解思路
拿到手的第一眼我觉得简单题,这不随便坐,有一个word单词然后去sequence中去寻找他的重复值,那不直接map遍历然后根据map加一取值就搞定的实行,很快傲,我三下五除二的做完了,代码如下:
public int maxRepeating(String sequence, String word) {
Map<String, Integer> map = new HashMap<>();
int endIndex = word.length();
for (int startIndex = 0; startIndex <= sequence.length(); startIndex++){
if(endIndex > sequence.length()){
break;
}
String str = sequence.substring(startIndex, endIndex);
if (map.containsKey(str)) {
map.put(str, map.get(str) + 1);
}else{
map.put(str, 1);
}
endIndex++;
}
return map.get(word) == null ? 0 : map.get(word);
}
然后自信提交,啪叽 红色报错,错误用例是
maxRepeating("aaabaaaabaaabaaaabaaaabaaaabaaaaba", "aaaba")
我们来自己观察这个用例,他前面都是aaaba但是在中间时他不是aaaba了,但是我的程序继续往后走map去匹配把后面的加进去了,诶坑就在这里的,注意题目他有两个字 《连续》 ,这个大坑!! 他一定要你连续记录,所以我们思路需要进行转变,我连忙切换成通过字符串拼接连续形式去字符串中寻找不就可以了!
最终解题答案
public int maxRepeating(String sequence, String word) {
int count = 0;
StringBuilder sb = new StringBuilder(word);
while(sequence.contains(sb)) {
count++;
sb.append(word);
}
return count;
}