判斷一個序列是否是另外一個序列的子序列的演算法
阿新 • • 發佈:2019-02-10
思路一:
從子序列中挨個找,找到一個之後,擷取子序列和母序列之前的,然後繼續遞迴自身
1.先分析下找不到的情況,如果母序列從頭找到尾,也沒有找到,則視為不是其子序列
2.繼續分析找到的情況,如果找到之後,並且子序列的長度為1,則代表都找完了。
3.如果這時子序列仍然還沒有找完,則擷取後繼續呼叫自身。
public static boolean isSubSequence(String sub,String mString){ for(int i = 0;i<sub.length();i++){ char currentChar = sub.charAt(i); for(int j = 0;j<mString.length();j++ ){
//代表找到了一個 if (currentChar==mString.charAt(j)){ //子序列找完了,條件二 if (sub.length()==1){ return true; }
//子序列沒找完,則繼續找;,條件三
sub = sub.substring(i+1); mString = mString.substring(j+1思路二:
思路一使用了遞迴和字串擷取,這種方法雖然可行,但是並不是那麼好理解。
我們換一種思路。使用遊標
public static boolean isSubSequence(String sub,String mString){ //用來記錄母序列遊標移動到哪裡了int ptr = 0; //外層迴圈遍歷子序列 for(int i = 0;i<sub.length();i++){ char currentChar = sub.charAt(i); //判斷遊標已經出了母序列了,則代表不是其子序列 if (ptr>=mString.length()){ return false; } for (int j = ptr;j<mString.length();j++ ){ //找到了一個子序列對應的字元了,遊標繼續移動 if (currentChar==mString.charAt(j)){ ptr = j+1; break; } //找到了最後一位了,卻沒有break,說明沒有找到 if (j==mString.length()-1){ return false; } } } return true; }