1. 程式人生 > >判斷一個序列是否是另外一個序列的子序列的演算法

判斷一個序列是否是另外一個序列的子序列的演算法

思路一:

從子序列中挨個找,找到一個之後,擷取子序列和母序列之前的,然後繼續遞迴自身

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
); return isSubSequence(sub,mString); } //母序列找到頭了,也沒有找到,條件一if (j==mString.length()-1){ return false; } } } return false;}
思路二:
思路一使用了遞迴和字串擷取,這種方法雖然可行,但是並不是那麼好理解。
我們換一種思路。使用遊標
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; }