題目17 判斷B是否是A的連續子列
阿新 • • 發佈:2018-11-17
題目17:判斷B是否是A的連續子列
這裡題目的複雜性在於:
連結串列不一定是有序排列的,其子列完全可以是無序狀態下的子列。
思想:首個元素開始兩兩比較,如果不等,B回退到首個元素,A回退到第二個元素,依次進行下去…… 直到B的鏈尾,表示匹配成功。不難發現,類似於字串的簡單匹配演算法。
bool subSequence(Node *a, Node *b){ //b∈a a = a->next; Node *pb = b->next; Node *p = a; while(a!=NULL and pb!=NULL){ if(a->num!=pb->num){ p = p->next; //移到下一個比較開始的位置 a = p; //重新設定開始比較的節點 pb = b->next; //重新設定開始比較的節點 }else{ a=a->next; //相等,就全部整體移動 pb=pb->next; } } if(pb==NULL) return true; else return false; }
題目18:判斷連結串列中字元是否中心對稱,如xyx
演算法思想:
使用棧來判斷連結串列中的資料是否中心對稱。
將連結串列中前一半元素依次進棧,在處理連結串列的後一半元素時,當訪問到連結串列的一個元素後,就從棧中彈出一個元素,兩個元素比較,若相等,則繼續直到連結串列尾部。否則為非中心對稱。
值得注意的是,長度是奇數時,中間節點不用比較。
bool isSemetery(Node *a){ int len = getListLength(a, true); int mid = len / 2; Node *p = a->next; char s[mid]; //字元棧 ,採用陣列棧,更貼切 int i=0; for(;i<mid;i++){ s[i] = p->num; p = p->next; } i--; //恢復最後的i值 if(len%2==1) //如果是奇數,跳過中心節點 p = p->next; while(p!=NULL and s[i]==p->num){ i--; //這裡就相當於退棧(棧頂指標的退棧) p=p->next; } if(i==-1) /**棧為空判斷, 因為上面的while迴圈中,i如果是最後一個元素, 退出後i=-1,剛好滿足棧的初始定義 **/ return true; else return false; }
作者:無涯明月
發文時間:2018-10-21