1. 程式人生 > 實用技巧 >CentOS下Nginx安裝配置使用說明

CentOS下Nginx安裝配置使用說明

題目:給定一個字串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 findSubstring(String s, String[] words) {

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());
}

}

}

}