leetcode 30. Substring with Concatenation of All Words

119人阅读 评论(0)
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){
}
}
return result;
}

}

个人资料
等级：
访问量： 3万+
积分： 1862
排名： 2万+
文章分类
最新评论