题目17 判断B是否是A的连续子列

版权声明:作者:weizu_cool https://blog.csdn.net/qq_26460841/article/details/83243549

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

猜你喜欢

转载自blog.csdn.net/qq_26460841/article/details/83243549
今日推荐