1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| package algorithm;
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;
public class SubstringWithConcatenationOfAllWords {
public static List<Integer> findSubstring(String s, String[] words) {
List<Integer> res = new ArrayList<>(); if (s == null || s.length() == 0 || words == null || words.length == 0) { return res; } Map<String, Integer> map = new HashMap<>(); int one_word = words[0].length(); int word_num = words.length; int all_len = one_word * word_num; for (String word : words) { map.put(word, map.getOrDefault(word, 0) + 1); } for (int i = 0; i < s.length() - all_len + 1; i++) { String tmp = s.substring(i, i + all_len); Map<String, Integer> tmp_map = new HashMap<>(); for (int j = 0; j < all_len; j += one_word) { String w = tmp.substring(j, j + one_word); tmp_map.put(w, tmp_map.getOrDefault(w, 0) + 1); } if (map.equals(tmp_map)) { res.add(i); } } return res; }
public List<Integer> findSubstring1(String s, String[] words) { List<Integer> res = new ArrayList<>(); Map<String, Integer> wordsMap = new HashMap<>(); if (s.length() == 0 || words.length == 0) return res; for (String word: words) { if (s.indexOf(word) < 0) return res; wordsMap.put(word, wordsMap.getOrDefault(word, 0) + 1); } int oneLen = words[0].length(), wordsLen = oneLen * words.length; if (wordsLen > s.length()) return res; for (int i = 0; i < oneLen; ++i) { int left = i, right = i, count = 0; Map<String, Integer> subMap = new HashMap<>(); while (right + oneLen <= s.length()) { String word = s.substring(right, right + oneLen); right += oneLen; if (!wordsMap.containsKey(word)) { left = right; subMap.clear(); count = 0; } else { subMap.put(word, subMap.getOrDefault(word, 0) + 1); ++count; while (subMap.getOrDefault(word, 0) > wordsMap.getOrDefault(word, 0)) { String w = s.substring(left, left + oneLen); subMap.put(w, subMap.getOrDefault(w, 0) - 1); --count; left += oneLen; } if (count == words.length) res.add(left); } } } return res; }
public static void main(String[] args) { String s = "aaaaaaaaaaaaaa"; String[] words = new String[]{"aa", "aa"}; System.out.println(findSubstring(s, words));
s = "wordgoodgoodgoodbestword"; words = new String[]{"word", "good", "best", "word"}; System.out.println(findSubstring(s, words));
s = "barfoofoobarthefoobarman"; words = new String[]{"bar", "foo", "the"}; System.out.println(findSubstring(s, words)); } }
|