class Solution:
def findSubstring(self, s: str, words: List[str]) -> List[int]:
word = len(words[0])
firstworld = set([word[0] for word in words])
allwords = len(words) * word
res = []
flag = dict({})
for wor in words:
if(flag.get(wor, 0)==0):
flag[wor] = 1
else:
flag[wor] += 1
flag_copy = flag.copy()
for i in range(len(s)):
if(s[i] not in firstworld):
continue
currs = s[i:i+allwords]
for j in range(0, len(currs), word):
curr = currs[j:j+word]
if (flag_copy.get(curr, 0) > 0):
flag_copy[curr] -= 1
else:
break
if (list(flag_copy.values()).count(0) == len(flag)):
res.append(i)
flag_copy = flag.copy()
return res
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int isSameStr(char *s1, char *s2, int len){
int i;
for(i=0; i<len; i++){
if(s1[i]!=s2[i]) return 0;
}
return 1;
}
int* findSubstring(char * s, char ** words, int wordsSize, int* returnSize){
*returnSize=0;
int slen=0, wordLen=0;
//获得字符串长度和单词长度
while(s[slen]) slen++; while(words[0][wordLen]) wordLen++;
if(slen<wordLen*wordsSize) return 0;
int *ans=malloc(sizeof(int)*(slen-wordLen*wordsSize+1));
// printf("hasIn\n");
//建立简易哈希
int wordsSum[wordsSize];
int i,j;
for(i=0; i<wordsSize; i++){
wordsSum[i]=0;
for(j=0; j<wordLen; j++){
wordsSum[i]+=words[i][j];
}
// printf("%d ", wordsSum[i]);
}
// puts("");
int wordsUsed[wordsSize];
for(i=0; i<wordsSize; i++) wordsUsed[i]=0;
//开始查看是否匹配
int index=0, val, wordNum;
// printf("wordLen:%d wordsSize:%d, slen:%d\n", wordLen, wordsSize, slen);
while(index+wordLen*wordsSize<=slen){
// puts("IN circle");
wordNum=0;
while(wordNum<wordsSize){
//获得第一个单词哈希值
val=0;
for(i=0; i<wordLen; i++){
val+=s[index+i+wordNum*wordLen];
}
// printf("%d ", val);
int isMatch=0; //是否匹配
//与简易哈希表中的字符串比较
for(i=0; i<wordsSize; i++){
//相等再比较字符串内容
if(val==wordsSum[i]){
if(isSameStr(s+index+wordNum*wordLen, words[i], wordLen)){
//被使用就继续比较
if(!wordsUsed[i]){wordsUsed[i]=isMatch=1; /*puts("match");*/ break;}
}
}
}
if(!isMatch) break;
wordNum++;
}
if(wordNum==wordsSize) ans[(*returnSize)++]=index;
for(i=0; i<wordsSize; i++) wordsUsed[i]=0;
index++;
}
return ans;
}