给定一个字符串 s 和一些 长度相同 的单词 words 。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/substring-with-concatenation-of-all-words
解题思路:
运用滑动窗口的思路,将s中每长度与words相同的一串单词分别进行比较,若相同则记录。
代码如下:
class Solution {
public List<Integer> findSubstring(String s, String[] words) {
List<Integer> ans=new ArrayList<Integer>();
int wordNum=words.length;
if(wordNum==0){
return ans;
}
int wordLen=words[0].length();
int len=s.length();
HashMap<String,Integer> allWords=new HashMap<String,Integer>();
for(String word:words){
allWords.put(word,allWords.getOrDefault(word,0)+1);
}
for(int i=0;i<len-wordNum*wordLen+1;i++){
HashMap<String,Integer> hasWords=new HashMap<String,Integer>();
int num=0;
for(;num<wordNum;num++){
String word=s.substring(i+num*wordLen,i+(num+1)*wordLen);
if(allWords.containsKey(word)){
hasWords.put(word,hasWords.getOrDefault(word,0)+1);
if(hasWords.get(word)>allWords.get(word)){
break;
}
}
else{
break;
}
}
if(num==wordNum){
ans.add(i);
}
}
return ans;
}
}