算法015:串联所有单词的子串

串联所有单词的子串. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/substring-with-concatenation-of-all-words/

如果是第一次接触这个题目,接触滑动窗口的题目,那么这个题目则非常困难。但是经过我我们之前几个题的滑动窗口的磨炼,这个题只是在上一个题目的基础上变难了一些,细节变多了一些。

首先,题目的要求是返回符合要求的下标:

并且要注意的是,和右边的数组里面的元素相同才符合题意,如果只有一个foo或者一个bar,则不满足要求。

既然以3个字母为一组,那么我们就可以简化成这样:

把三个字符看成一个整体,left和right指针也是进行整体的加减。如此会出现一个问题,如果符合题目要求的字符,是从第二个,第三个字母开始的呢?

我们就循环几次,第一次把abb作为一个整体,第二次把bba作为一个整体,第三次把bar作为一个整体,并且只需要几次就可以全部覆盖到,这个次数和words里面的元素的长度有关。

在这个循环里面,就变成了跟上一个题目一样了,也是进窗口,维护count,出窗口,维护count

要注意的是,right和left的起始位置,跟上一层循环有关,right和left向右移动的长度,和words里面的元素的长度有关。

代码:

class Solution {
    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer> ret = new ArrayList<Integer>();

        Map<String, Integer> hash1 = new HashMap<String, Integer>();
        for(String str: words){
            hash1.put(str, hash1.getOrDefault(str,0) + 1);
        }
        int len = words[0].length();
        int m = words.length;
        for(int i = 0; i < len; i++){
            Map<String, Integer> hash2 = new HashMap<String, Integer>();
            for(int left = i, right = i, count = 0; right + len <= s.length(); right += len){
                String in = s.substring(right, right + len);
                hash2.put(in, hash2.getOrDefault(in, 0) + 1);
                if(hash2.get(in) <= hash1.getOrDefault(in, 0)){
                    count++;
                }
                if(right - left + 1 > len * m){
                    String out = s.substring(left, left + len);
                    if(hash2.get(out) <=  hash1.getOrDefault(out, 0)){
                        count--;
                    }
                    hash2.put(out, hash2.get(out) - 1);
                    left += len;
                }
                if(count == m){
                    ret.add(left);
                }
            }
        }
        return ret;
    }
}

相关推荐

  1. 算法题】30. 串联所有单词

    2024-07-18 01:16:05       48 阅读
  2. leedcode串联所有单词

    2024-07-18 01:16:05       52 阅读
  3. leetcode 30. 串联所有单词

    2024-07-18 01:16:05       60 阅读
  4. LeetCode 30. 串联所有单词

    2024-07-18 01:16:05       50 阅读
  5. 面试经典题---30.串联所有单词

    2024-07-18 01:16:05       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 01:16:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 01:16:05       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 01:16:05       58 阅读
  4. Python语言-面向对象

    2024-07-18 01:16:05       69 阅读

热门阅读

  1. 大数据测试

    2024-07-18 01:16:05       22 阅读
  2. Hadoop学习记录一

    2024-07-18 01:16:05       21 阅读
  3. C++正则表达式

    2024-07-18 01:16:05       22 阅读
  4. try-with-resources

    2024-07-18 01:16:05       21 阅读
  5. 引领职场潮流,从这个霍兰德测试掌握先机!

    2024-07-18 01:16:05       20 阅读
  6. HG/T 3655-2024 紫外光UV固化木器涂料检测

    2024-07-18 01:16:05       19 阅读