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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM