LeetCode第30题: 与所有单词相关联的字串
Posted andingding
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode第30题: 与所有单词相关联的字串相关的知识,希望对你有一定的参考价值。
30. 与所有单词相关联的字串
给定一个字符串 s 和一些长度相同的单词 words。在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。
示例 1:
输入:
s = "barfoothefoobarman",
words = ["foo","bar"]
输出: [0,9]
解释: 从索引 0 和 9 开始的子串分别是 "barfoor" 和 "foobar" 。
输出的顺序不重要, [9,0] 也是有效答案。
示例 2:
输入:
s = "wordgoodstudentgoodword",
words = ["word","student"]
输出: []
class Solution: def split(self,string,width):#将一个字符串string按着width的宽度切开放在一个列表中,返回这个列表。 result = [] i = 0 length = len(string) while i<=length-width: result.append(string[i:i+width]) i = i+width return result def findSubstring(self, s, words): """ :type s: str :type words: List[str] :rtype: List[int] """ result = [] words_count = len(words) if words_count>0:#判断输入的s和words是否为空,如果不为空,将words中的单词的宽度放在length_word中 length_word = len(words[0]) else: length_word = 0 i= 0 length_s = len(s) if length_s == 0 or words_count == 0:#如果s为空或者words为空,返回空的列表 return [] while i <= length_s-length_word*words_count:#利用while循环,实现对s遍历 string_list = self.split(s[i:i+length_word*words_count],length_word)#将s从i开始切分出一个长度和words中所有单词加在一起长度相同的一个子串,并将这个子串切开,放在string_list中 string_list.sort()#由于words中的单词并不是排好序的,所以这里需要调用两个sort函数,将这两个列表排序,这样才能够判断他们是否相等。 words.sort() if string_list == words:#如果不是排好序的列表,即使里面的元素都相等,但是顺序不等的话,也是不会相等的。 result.append(i) i = i + 1 return result
这道题整体的解题思路就是:
1、计算words中单词的个数和每个单词的长度,用于计算在对s切分时的长度。
2、排除掉s为空和words为空的情况
3、利用while实现对s按着length_word*words_count的宽度进行切分,产生各种子串。
4、将切分的子串再次切分成以length_word为宽度的单词,放在列表中。
5、对列表进行排序(这样可以避免两个列表中单词顺序不同而无法正确比较的情况)
6、比较两个列表,将结果放在result的列表中,并返回这个result。
以上是关于LeetCode第30题: 与所有单词相关联的字串的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode每天一题Longest Substring Without Repeating Characters(最长无重复的字串)