package algorithm;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/*
参考:https://blog.csdn.net/DERRANTCM/article/details/47064933
参考:https://www.cnblogs.com/grandyang/p/4521224.html
//【030-Substring with Concatenation of All Words(串联所有单词的子串)
//substring 求子串; 子字串; 取子串; 截取子串; 取子字符串; concatenation 一系列相关联的事物(或事件);
原题
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).
题目大意
给定一个字符串s和一个字符串数组words,wrods中的字符串长度都相等,找出s中所有的子串恰好包含words中所有字符各一次,返回子串的起始位置。
//indices 原型和指数;intervening发生于其间的; 介于中间的;v. 出面; 介入; 插嘴; 打断(别人的话); 阻碍; 阻挠; 干扰;
*/
public class ConcatenationOfAllWords {
/*
方法一、
求字符串s的子串,使其包含所求的所有单词,即此子串的长度=关键词*n。
设:s总长度为sLength,n个关键词为n*key.length;
每次需截取长度为n*key.length的长度的s的子字符串,在子字符串后,在对各个单词分别进行比较,如果子字符串长度为
key.length的字符串在关键词中不存在,则直接停止,继续;如果子字符串中的key的个数,超过key中的个数,则也break;
* */
public static List<Integer> solution1(String s,String[] keys){
List<Integer> list = new ArrayList<Integer>();
if(s==null||keys==null){
return list;
}
int sLen=s.length();
int nLen=keys.length*keys[0].length();
System.out.println(sLen+" "+nLen);
if(sLen<nLen){
return list;
}
Map<String,Integer> map=new HashMap<String,Integer>();
for(int i=0;i<keys.length;i++){
map.put(keys[i], map.containsKey(keys[i])?map.get(keys[i])+1:1);
}
for(int i=0;i<=sLen-nLen;i++){
String ss=s.substring(i,i+nLen);
System.out.println("总的为:"+ss);
Map<String,Integer> map2=new HashMap<String,Integer>();
int j=0;
for(j=0;j<nLen;j+=keys[0].length()){
String key1=ss.substring(j,j+keys[0].length());
if(!map.containsKey(key1)){ //不包含,则不符合
break;
}else{//包含
map2.put(key1, map2.containsValue(key1)?map2.get(key1)+1:1);
if(map2.get(key1)>map.get(key1)){
break;
}
}
}
if(j==nLen){
list.add(i);
}
System.out.println(j);
}
return list;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String s="barfoothefoobarbarman";
String[] keys={"foo", "bar","bar"};
List<Integer> list=solution1(s,keys);
System.out.println(list);
}
}