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

T23713 [愚人节题目2]数据结构大毒瘤 提交答案加入题单复制题目 提交 1.47k 通过 273 时间限制 1.00s 内存限制 125.00MB 题目编号 T23713 提供者 洛谷官方团队 难度 暂无评定 历史分数 暂无 提交记录 标签 洛谷原创 推荐题目 暂无 复制 Markdown 展开 进入 IDE 模式 题目背景 这是一道毒瘤题 这题太难了,所以窝先卖个萌0=w=0 窝从没出过这么难的题!!!! 题目描述 你好啊~这是一道数据结构毒瘤题~ 您需要维护一个数S~ 有7种操作,形如w a b c w=0 输出S a ​ +S a+1 ​ +...+S b ​ 。c没有用 w=1 将[S a ​ ,S b ​ ]翻转。c没有用 w=2 将[S a ​ ,S b ​ ]内的数全部加上c。 w=3 将[S a ​ ,S b ​ ]内的数全部乘上c。 w=4 将[S a ​ ,S b ​ ]内的数全部开根号。c没有用 w=5 将S a ​ 加上c,将S a+1 ​ 加上2c,...,将S b ​ 加上c*(b-a+1) w=6 将[S a ​ ,S b ​ ]和[S b+1 ​ ,S c ​ ]交换。保证c-b=b-a+1。 输入格式 第一行是n和m,n表示初始序的长度,m表示操作数量 然后n个整数,表示初始序S 之后m行每行四个数w a b c,代表一个操作 输出格式 对于每个0操作,输出一行表示答案 输入输出样例 输入 #1复制 5 1 1 2 3 4 5 0 1 2 3 输出 #1复制 3 说明/提示 样例解释 第一次操作,询问的答案为1+2=3 数据范围 1≤n,m≤5×10 4 ,0≤w≤9,1≤a≤b≤n 保证任何时候S i ​ ∈[−10 9 ,10 9 ] 保证输入所有数∈[−10 9 ,10 9 ]
最新发布
07-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦否

文章对你有用?不妨打赏一毛两毛

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值