原题地址:https://oj.leetcode.com/problems/substring-with-concatenation-of-all-words/
题意:
You are given a string, S, and a list of words, L, that are all of the same length. Find all starting indices of substring(s) in S that is a concatenation of each word in L exactly once and without any intervening characters.
For example, given:
S: "barfoothefoobarman"
L: ["foo", "bar"]
You should return the indices: [0,9]
.
(order does not matter).
解题思路:使用一个字典统计一下L中每个单词的数量。由于每个单词的长度一样,以题中给的例子而言,可以3个字母3个字母的检查,如果不在字典中,则break出循环。有一个技巧是建立一个临时字典curr,用来统计S中那些在L中的单词的数量,必须和L中单词的数量相等,否则同样break。
代码:
class Solution: # @param S, a string # @param L, a list of string # @return a list of integer def findSubstring(self, S, L): words={} wordNum=len(L) for i in L: if i not in words: words[i]=1 else: words[i]+=1 wordLen=len(L[0]) res=[] for i in range(len(S)+1-wordLen*wordNum): curr={}; j=0 while j<wordNum: word=S[i+j*wordLen:i+j*wordLen+wordLen] if word not in words: break if word not in curr: curr[word]=1 else: curr[word]+=1 if curr[word]>words[word]: break j+=1 if j==wordNum: res.append(i) return res