• 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-
                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。

     
  • 相关阅读:
    软工个人项目作业
    软工个人博客作业(2)
    软工第一次作业-热身
    OO第四单元
    OO第三单元
    OO第二单元总结
    面向对象UML单元总结及课程总结
    JML单元总结
    面向对象设计与构造第二单元总结
    OO第一单元小结
  • 原文地址:https://www.cnblogs.com/andingding-blog/p/9055364.html
Copyright © 2020-2023  润新知