leetcode刷题 之 最大重复子字符串

60 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}