1. 程式人生 > >題目17 判斷B是否是A的連續子列

題目17 判斷B是否是A的連續子列

題目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