import org.omg.CORBA.StringHolder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author xnl
* @Description:
* @date: 2022/6/23 22:32
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
String s = "barfoothefoobarman";
String[] words = {"foo","bar"};
System.out.println(solution.findSubstring2(s, words));
}
public List<Integer> findSubstring(String s, String[] words) {
// 存储单词个数
Map<String, Integer> map = new HashMap<>();
for (String word : words) {
map.put(word, map.getOrDefault(word, 0) + 1);
}
int n = s.length(), m = words.length, k = words[0].length();
// 结果
List<Integer> res = new ArrayList<>();
out: for (int i = 0; i + m * k <= n; i++){
Map<String, Integer> cur = new HashMap<>();
String substring = s.substring(i, i + m * k);
for (int j = 0; j < substring.length(); j += k){
String item = substring.substring(j, j + k);
if (!map.containsKey(item)){
continue out;
}
cur.put(item, cur.getOrDefault(item, 0) + 1);
}
if (cur.equals(map)){
res.add(i);
}
}
return res;
}
public List<Integer> findSubstring2(String s, String[] words) {
int n = s.length(), m = words.length, k = words[0].length();
List<Integer> list = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
for (String word :words){
map.put(word, map.getOrDefault(word, 0 ) + 1);
}
for (int i = 0; i < k; i++){
Map<String, Integer> cur = new HashMap<>();
for (int j = i; j + k <= n; j += k){
String temp = s.substring(j, j + k);
cur.put(temp, cur.getOrDefault(temp, 0) + 1);
if (j >= i + (m * k)){
int idx = j - m * k;
String prev = s.substring(idx, idx + k);
if (cur.get(prev) == 1){
cur.remove(prev);
} else {
cur.put(prev, cur.get(prev) - 1);
}
if (!cur.getOrDefault(prev, 0).equals(map.getOrDefault(prev, 0))) {
continue;
}
}
if (!cur.getOrDefault(temp, 0).equals(map.getOrDefault(temp, 0))){
continue;
}
if (cur.equals(map)){
list.add(j - (m - 1) * k);
}
}
}
return list;
}
}