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).
题目链接:https://leetcode.com/problems/substring-with-concatenation-of-all-words/
题目分析:先对words中的单词map一下,然后枚举s的起点,暴力判断,击败了50%左右
public class Solution {
public List<Integer> findSubstring(String s, String[] words) {
List<Integer> ans = new ArrayList<>();
Map<String, Integer> mp = new HashMap<>();
int n = words.length;
if (n == 0) {
return ans;
}
for (int i = 0; i < n; i ++) {
Integer num = mp.get(words[i]);
if (num == null) {
mp.put(words[i], 1);
}
else {
mp.put(words[i], num + 1);
}
}
int len = words[0].length();
int sumLen = n * len;
for (int i = 0; i <= s.length() - sumLen; i ++) {
boolean flag = true;
Map<String, Integer> mpCopy = new HashMap<>(mp);
for (int j = i; j < i + sumLen; j += len) {
String cur = s.substring(j, j + len);
Integer num = mpCopy.get(cur);
if (num == null || num == 0) {
flag = false;
break;
}
mpCopy.put(cur, num - 1);
}
if (flag) {
ans.add(i);
}
}
return ans;
}
}