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。