LeetCode-30 串联所有单词的子串

简介: LeetCode-30 串联所有单词的子串

来源:力扣(LeetCode)

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

题目描述

给定一个字符串 s 和一些 长度相同 的单词 words 。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。

注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。

 

示例 1:
输入:s = "barfoothefoobarman", words = ["foo","bar"]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。
输出的顺序不重要, [9,0] 也是有效答案。
示例 2:
输入:s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"]
输出:[]
示例 3:
输入:s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
输出:[6,9,12]
提示:
1 <= s.length <= 104
s 由小写英文字母组成
1 <= words.length <= 5000
1 <= words[i].length <= 30
words[i] 由小写英文字母组成

解题思路

题目中重点强调了长度相同,这就是解题的关键,由于长度相同,我们完全可以知道子串的长度就是单个单词长度乘以单词个数,所以可以使用一个子串长度的滑动窗口,依次判断各个起始位置的滑动窗口内子串是否符合题目要求。

同样由于单词长度固定已知,可以直接将窗口内的子串拆解成一个一个单词判断是否在words数组内,为了提高速度,可以把words数组内的单词存入一个哈希表。

代码展示

 

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> viRet;
        unordered_map<string, int> striMap, strimapTemp;
        for(auto word: words)
        {
            striMap[word]++;
        }
        int iLen = words.size() * words[0].size();
        for(int i = 0; i < s.size() - iLen + 1; i++)
        {
            strimapTemp = striMap;
            bool bTemp = true;
            for(int j = 0; j < words.size(); j++)
            {
                string word = s.substr(i + j * words[0].size(), words[0].size());
                if(strimapTemp[word] == 0)
                {
                    bTemp = false;
                    break;
                }
                strimapTemp[word]--;
            }
            if(bTemp)
                viRet.push_back(i);
        }
        return viRet;
    }
};

运行结果

 

相关文章
|
17天前
|
存储 算法 测试技术
力扣经典150题第三十三题:最小覆盖子串
力扣经典150题第三十三题:最小覆盖子串
10 1
|
1月前
|
算法
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
|
17天前
|
算法 测试技术 索引
力扣经典150题第三十二题:串联所有单词的子串
力扣经典150题第三十二题:串联所有单词的子串
9 0
|
17天前
|
算法
力扣经典150题第二十一题:反转字符串中的单词
力扣经典150题第二十一题:反转字符串中的单词
10 0
|
17天前
|
算法
力扣经典150题第十九题:最后一个单词的长度
力扣经典150题第十九题:最后一个单词的长度
10 0
|
1月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
1月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
1月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
1月前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
|
1月前
|
算法 容器
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词