#網路流,最小割#洛谷 1344 [USACO4.4]追查壞牛奶Pollutant Control
題目:給定一個字串s和一些長度相同的單詞words。找出 s 中恰好可以由words 中所有單詞串聯形成的子串的起始位置。
注意子串要與words 中的單詞完全匹配,中間不能有其他字元,但不需要考慮words中單詞串聯的順序。
示例 1:
輸入:
s = "barfoothefoobarman",
words = ["foo","bar"]
輸出:[0,9]
解釋:
從索引 0 和 9 開始的子串分別是 "barfoo" 和 "foobar" 。
輸出的順序不重要, [9,0] 也是有效答案。
程式碼:
1.超時方法
class Solution { //回溯法,排列樹,先求words中字串所有組合,再比較是否匹配;
public List
StringBuilder str=new StringBuilder(); List<Integer> list= new ArrayList<Integer>(); if(s==null||words.length==0){return list;} backTrack(0,words,s,str,list); return list; } public static void swap(String[] words,int i,int j){ String temp=new String(words[i]); words[i]=words[j]; words[j]=temp; } public static void backTrack(int t,String[] words,String s,StringBuilder str,List<Integer> list){ if(t>=words.length){ //所有words字串都已在組合中 int i=0; while(i<=(s.length()-str.length())){ if(s.substring(i).contains(str.toString())&&!list.contains(s.indexOf(str.toString(),i))){
//組合串在s.substring(i)中(組合串可能多次出現),words中有重複組合串會重複出現匹配情況所以要考慮下標是否存在,下標尚未存入list中
list.add(s.indexOf(str.toString(),i));
}
i++;
}
}
else{
for(int k=t;k<words.length;k++){
swap(words,t,k);
str.append(words[t]);
if(s.contains(str.toString())){ //s中包含了目前的字元字串,就有繼續組合下去的必要,沒有目前字串,後續再怎麼組合都不可能了
backTrack(t+1,words,s,str,list);}
swap(words,t,k);
str.delete(str.length()-words[k].length(),str.length());
}
}
}
}