[LeetCode]30. 串联所有单词的子串

题目描述

难度 困难

给定一个字符串 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] 由小写英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路

     * 思路1:(行不通)
     * 求出words可以组成的所有的不同的组合数,并存入字符串数组;
     * String.indexof求得下标;
     
     * 思路2:解答错误
     * 游动串思路(扫描思路,每次移动1位)+2个HashMap+1个队列来实现

代码实现

扫描思路示意图

执行结果:解答错误
通过测试用例:122 / 176
输入:
"ababababab"
["ababa","babab"]
输出:
[]
预期结果:
[0]
头大,暂未实现,记录与总结,2021年 11月 10日 星期三 12:09:38 CST。

题意理解错误,再次实现

原因:思路2的实现,对题意的理解有错误,有1个bug:只是移动1位逐个的对游串做比对,没有理解“所有单词串联”,导致基本逻辑上有错误。

     * 思路3:
     * 扫描思路(游动串,每次移动单词长度位)+2个HashMap来实现

执行结果:通过
执行用时:85 ms, 在所有 Java 提交中击败了59.28% 的用户
内存消耗:39.2 MB, 在所有 Java 提交中击败了31.40% 的用户
通过测试用例:176 / 176

记录与总结,2021年 11月 11日 星期四 00:27:40 CST。 

优化1

     * 思路3:
     * 扫描思路(每次移动单词长度位,扫描+单次游动串组合)+2个HashMap来实现

执行结果:通过
执行用时:79 ms, 在所有 Java 提交中击败了64.95% 的用户
内存消耗:38.8 MB, 在所有 Java 提交中击败了84.86% 的用户
通过测试用例:176 / 176

记录与总结,2021年 11月 11日 星期四 01:32:17 CST。

猜你喜欢

转载自blog.csdn.net/u014132947/article/details/121240548