You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.
For example, given:
s:"barfoothefoobarman"
words: ["foo", "bar"]
You should return the indices: [0,9]
.
题意:找出所给列表words中的单词相接的子句在s中出现的索引。
注意:words中的单词可能重复出现
思路:1.建立一个字典wdict,统计words中所有单词的个数
2.判断s中所有可能的子句是否符合要求
1)判断字据中每个单词是否出现在wdict中,没有的话,此子句不符合要求
2)子句符合要求的话,加入新的属于子句的字典,如果子句中某个单词出现的次数超过wdict中这个单词出现的个数,此子句不符合要求
1 class Solution(object): 2 def findSubstring(self, s, words): 3 """ 4 :type s: str 5 :type words: List[str] 6 :rtype: List[int] 7 """ 8 res = [] 9 length = len(words[0])10 num = len(words)11 l = length*num12 lens = len(s)13 wdict = {}14 sset = set()#建立集合,收集所有已经符合条件的字句,减少判断次数15 for word in words:16 wdict[word] = 1+(wdict[word] if word in wdict else 0)17 first_char = set(w[0] for w in words)#建立集合收集所有单词中的第一个字母,减少isRequired的次数18 for i in range(lens-l+1):19 if s[i] in first_char:20 tmp = s[i:i+l]21 if tmp in sset or self.isRequired(tmp,wdict,length):22 sset.add(tmp)23 res.append(i)24 return res25 def isRequired(self,s,wdict,length):26 comp = {}27 i = 028 while(iwdict[tmp]:35 return False36 i += length37 return True38 39