力扣的串联所有单词的子串解法
题目描述:
给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。
示例 1:
输入:
s = “barfoothefoobarman”,
words = [“foo”,“bar”]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 “barfoo” 和 “foobar” 。
输出的顺序不重要, [9,0] 也是有效答案。
示例 2:
输入:
s = “wordgoodgoodgoodbestword”,
words = [“word”,“good”,“best”,“word”]
输出:[]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
参考程序1:
class Solution:
def findSubstring(self, s: str, words: List[str]) -> List[int]:
if not words: return []
if not s: return []
length_words = len(words[0])
result = []
for index in range(len(s)-length_words*len(words)+1):
i = index
words_temp = []
while(i<index+length_words*len(words)):
if s[i:i+length_words] in words:
words_temp.append(s[i:i+length_words])
i += length_words
else:
break
if len(words)==len(words_temp) and sorted(words)==sorted(words_temp):
result.append(index)
return result
运行结果1:
参考程序2:
class Solution:
def findSubstring(self, s: str, words: List[str]) -> List[int]:
if not words:
return []
words_dict = collections.defaultdict(int)
for word in words:
words_dict[word] += 1
s_length, words_length, word_length, result = len(s), len(words), len(words[0]), list()
for k in range(word_length):
head_words, num = collections.defaultdict(int), 0
for i in range(k, s_length, word_length):
word = s[i:i + word_length]
if word in words_dict:
num += 1
head_words[word] += 1
while head_words[word] > words_dict[word]:
pos = i - word_length*(num - 1)
temp_word = s[pos:pos + word_length]
head_words[temp_word] -= 1
num -= 1
else:
head_words.clear()
num = 0
if num == words_length:
result.append(i - word_length*(num - 1))
return result
运行结果2:
参考程序3:
class Solution:
def findSubstring(self, s: str, words: List[str]) -> List[int]:
words_s = sorted(words)
result = []
if len(words_s)==0:
return result
len_eachword = len(words_s[0])
len_word = len(words_s)
total_len = len_eachword*len_word
if len(s)<total_len:
return result
for word in set(words_s):
for i in range(len(s)-total_len+1):
checklist_s = list()
if s[i:i+len_eachword] == word:
for j in range(i,i+total_len,len_eachword):
checklist_s.append(s[j:j+len_eachword])
checklist_s = sorted(checklist_s)
if checklist_s == words_s:
result.append(i)
return result
运行结果3: