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。

 

猜你喜欢

转载自www.cnblogs.com/andingding-blog/p/9055364.html