您的位置:首页 > 其它

leetcode--30. Substring with Concatenation of All Words

2017-07-22 00:32 579 查看

问题

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).

意思就是给你一个字符串,和一个字符串的数组,需要返回一个该字符串的索引组成的数组,返回的索引有如下性质:从每个索引开始,长度为L的字串需要精确包含字符串数组中的所有字符串(不多不少)。L 为字符串数组中所有字符串长度之和。

思路

参考了leetcode的讨论,总结思路如下:用一个map将数组中的字符串放进去,key为字符串,value为该字符在数组中出现的次数。然后用两个指针遍历原来的字符串。i来控制需要返回的起始索引。j来控制截取字符串。每次从一段范围内截出一个词,判断该词是否在map中,如果没有则立刻跳出循环。如果有,再取出该字符串对应的value,如果等于1,就将他从map中移除,如果大于1则将value减一。最后如果map为空,说明所有的字符串都匹配。添加i到list中,跳出循环,开始下一轮循环。代码如下:

public List<Integer> findSubstring(String S, String[] L) {
List<Integer> res = new ArrayList<Integer>();
if (S == null || L == null || L.length == 0) return res;
int len = L[0].length();
Map<String, Integer> map = new HashMap<String, Integer>();
for (String w : L) map.put(w, map.containsKey(w) ? map.get(w) + 1 : 1);
for(int i=0;i<=S.length()-len*L.length;i++){
Map<String, Integer> copy = new HashMap<String, Integer>(map);
for(int j=0;j<L.length;j++){
String str = S.substring(i+j*len,i+j*len+len);//next word
if(copy.containsKey(str)){
int count = copy.get(str);
if(count == 1) copy.remove(str);
else copy.put(str,count-1);
if(copy.isEmpty()){
res.add(i);
break;
}
}else{
break;
}
}
}
return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: