CodeCollection2018
8/28/2019 - 8:21 AM

串联所有单词的子串-Substring with Concatenation of All Words

s = "barfoothefoobarman", words = ["foo","bar"] Output: [0,9] s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"] Output: []

public static List<Integer> concatWords(String s,String[] args){
	    if(args==null || args.length==0) return new ArrayList<Integer>();;
	    int item_len = args[0].length();
	    Set<String> set = new HashSet<>();
	    List<String> list = new ArrayList<>();
	    for(String str : args) list.add(str);
	    set.addAll(list);//如果args字符串数组中有重复的字符串则应该用Hashmap来记录各个字符串出现次数而非集合来记录
	    List<Integer> res = new ArrayList<>();
	    for(int i = 0; i <= s.length()-item_len*args.length; ) {
	    	String cur = s.substring(i, i+item_len);
	    	int index = i;
	    	while(set.contains(cur)) {
	    		set.remove(cur);
	    		index += item_len;
	    		if(index+item_len<=s.length())  //注意等号
	    			cur = s.substring(index,index+item_len);
	    	}
	    	if(set.isEmpty()) {
	    		res.add(i);
	    		i += item_len*args.length;
	    	}else if(set.size() < list.size()){
	    		i += (list.size()-set.size())*item_len;
	    	}else i++;
	    	set.addAll(list);
	    }
	    return res;
	}