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).
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by lxw, liwei4939@126.com on 2018/3/6. */ public class SubstringWithConcatenationAllWords { public List<Integer> findSubString(String s, String[] words){ Map<String, Integer> counts = new HashMap<>(); for (String word : words){ counts.put(word, counts.getOrDefault(word, 0) + 1); } List<Integer> res = new ArrayList<>(); int len = s.length(), num = words.length, wordLen = words[0].length(); for (int i = 0; i < len - num * wordLen + 1; i++){ Map<String, Integer> tmp = new HashMap<>(); int j = 0; while (j < num){ String word = s.substring(i + j*wordLen, i + (j+1)*wordLen); if (counts.containsKey(word)){ tmp.put(word, tmp.getOrDefault(word, 0) + 1); if (tmp.get(word) > counts.get(word)){ break; } } else { break; } j++; } if (j == num){ res.add(i); } } return res; } public static void main(String[] args){ SubstringWithConcatenationAllWords tmp = new SubstringWithConcatenationAllWords(); String str = "barfoothefoobarman"; String[] words = new String[]{"foo", "bar"}; System.out.print(tmp.findSubString(str, words)); } }