leetcode的串联所有单词的子串

简介: leetcode的串联所有单词的子串

公众号merlinsea


题目描述


   给定一个字符串 s 和一些 长度相同 的单词 words 。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。

链接:https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words


示例


输入:s = "barfoothefoobarman", words = ["foo","bar"]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。
输出的顺序不重要, [9,0] 也是有效答案。


解题思路:

   双hashMap+滑动窗口实现。这种题目特点就是条件要求全部满足的连续子序列, 如果出现了条件不满足的情况就应该停下来通过移动左边界直至条件满足才能继续向下 执行。


代码实现:


class Solution {
    private Map<String,Integer> map = new HashMap<>();
    public List<Integer> findSubstring(String s, String[] words) {
        ArrayList<Integer> list = new ArrayList<>();
        int oneWordLen = words[0].length();
        for(String word : words){
            map.put(word,map.getOrDefault(word,0)+1);
        }
        for(int i = 0;i<oneWordLen;i++){
            int left = i;
            int right = i;
            int count = 0;
            Map<String,Integer> tempMap = new HashMap<>();
            while(right+oneWordLen<=s.length()){
                String word = s.substring(right,right+oneWordLen);
                right = right+oneWordLen;
                if(!map.containsKey(word)){
                    //当前word不在map中,那么不论怎么移动left都无济于事
                    count=0;
                    tempMap.clear();
                    left=right;
                }else{
                    count++;
                    tempMap.put(word,tempMap.getOrDefault(word,0)+1);
                    while(tempMap.get(word) > map.get(word)){
                        //出现了条件不满足的情况应该停下来移动左边界直到条件满足为止
                        String firstWord = s.substring(left,left+oneWordLen);
                        left = left+oneWordLen;
                        tempMap.put(firstWord,tempMap.get(firstWord)-1);
                        count--;
                    }
                    if(count==words.length){
                        list.add(left);
                        count--;
                        String firstWord = s.substring(left,left+oneWordLen);
                        left=left+oneWordLen;
                        tempMap.put(firstWord,tempMap.get(firstWord)-1);
                    }
                }
            }
        }
        return list;
    }
}
相关文章
|
2天前
|
存储 算法 测试技术
力扣经典150题第三十三题:最小覆盖子串
力扣经典150题第三十三题:最小覆盖子串
6 1
|
17天前
|
算法
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
|
2天前
|
算法 测试技术 索引
力扣经典150题第三十二题:串联所有单词的子串
力扣经典150题第三十二题:串联所有单词的子串
5 0
|
2天前
|
算法
力扣经典150题第二十一题:反转字符串中的单词
力扣经典150题第二十一题:反转字符串中的单词
6 0
|
2天前
|
算法
力扣经典150题第十九题:最后一个单词的长度
力扣经典150题第十九题:最后一个单词的长度
6 0
|
17天前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
16天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
16天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
17天前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
|
17天前
|
算法 容器
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词