力扣每日一题Day31
没有什么是不可能的 ; 这个词本意就是“我有一切可能” 。
题目描述:
给定一个字符串 s
和一个字符串数组 words
。 words
中所有字符串 长度相同。
s
中的 串联子串 是指一个包含 words
中所有字符串以任意顺序排列连接起来的子串。
- 例如,如果
words = ["ab","cd","ef"]
, 那么"abcdef"
,"abefcd"
,"cdabef"
,"cdefab"
,"efabcd"
, 和"efcdab"
都是串联子串。"acdbef"
不是串联子串,因为他不是任何words
排列的连接。
返回所有串联子串在 s
中的开始索引。你可以以 任意顺序 返回答案。
解题代码:
1 | class Solution { |
解读与收获:
困难题。花了我比较长的时间(题解也看了很久),简单说一下思路:用两个hashmap(wordmap,smap)分别用来存放words中的单词和出现数量,以及在窗口中的单词以及出现数量。然后三层循环:第一层是用来确定滑动窗口的出发点,来保证能遍历到s的每一个子串,第二、三层循环用来进行窗口滑动,i是窗口左边界,j为右边界。每次取右边界的一个长为wordlen的单词进行判断,如果该单词不在wordmap,则将i加速到j的位置(之前窗口内所有单词都失效了),还有可能是单词在wordmap但是数量超过了规定数,则i进行右移(将一个单词移出窗口),若两种情况都不符合,说明是我们要找的字串,记录下标i。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 驴の奇思妙想!
评论