import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//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].
//(order does not matter).
public class Solution {
public static void main(String[] args) {
String input1 = "barbarbarfoofoo";
String[] input2 = {"foo","bar","bar"};
List<Integer> result = findSubstring(input1,input2);
System.out.println(result);
}
public static List<Integer> findSubstring(String s, String[] words) {//words中字符串的长度是一样的
List<Integer> result = new ArrayList<Integer>();
Map<String,Integer> tmp,map=new HashMap<String,Integer>();
int lens=s.length(),lenw=words[0].length();
for(int i=0;i<words.length;i++){ //将words中的字符串及其数量存入map中
if(map.containsKey(words[i])){
map.put(words[i],map.get(words[i])+1); //map中有该字符串则数量加一
}else{
map.put(words[i],1);
}
}
for(int i=0;i<=lens-lenw*words.length;i++){ //从开始到s长度减去words中字符串长度之和
tmp=new HashMap<String,Integer>();
int j=0;
for(;j<words.length;j++){
int pos=i+j*lenw;
String sub=s.substring(pos,pos+lenw);
if(map.containsKey(sub)){ //查看s中特定位置的字符串在words中是否存在
int num=0;
if(tmp.containsKey(sub)){
num=tmp.get(sub); //num为sub到目前为止在s中的出现次数
}
int a = map.get(sub); //计算sub在words中出现的次数
if(a < num+1){ //如果words中出现次数少于s中的出现次数,则不可能匹配成功
break;
}else{
tmp.put(sub,num+1); //存sub到目前为止的tmp中
}
}else{
break;
}
}
if(j>=words.length){
result.add(i); //将i加入结果列表中
}
}
return result;
}
}
leetcode 30. Substring with Concatenation of All Words
最新推荐文章于 2024-09-15 09:47:04 发布