当前位置: 首页>编程语言>正文

408算法题专项-2012年

题目:408算法题专项-2012年,第1张

分析:时间上高效,说明可能存在空间换时间的算法。

思路一:双重循环

思考:双重遍历找到共同后缀的起始位置。按照这种思路输入的数据必需保证共同后缀的地址是相同的。自己处理有点麻烦,所以没写完整的可运行代码。至于NULL的情况应该是没有的,题目应该是保证一定存在后缀。加NULL是为了严谨一些。

node* check(list str1,list str2)
{
	node*p,*q;
	p=str1->next;//指向头结点
	while(p!=NULL)
	{
		q=str2->next;
		while(q!=NULL)
		{
			if(p==q)
				return p;
			q=q->next;
		}
		p=p->next;
	}
	return NULL;//没找到的情况
}

时间复杂度:O(len1*len2),空间复杂度O(1)len1为str1所指链表长度,len2为str2所指长度。

思路二:假设空间换时间后优化

思考:题目说时间上高效已经提示可能存在空间换时间的思路。假设存在,我们可以想到把两条链表放到数组里,然后让数组进行尾对齐。假设len2>len1,那么当len2遍历到len2-len1的时候,就能很容易找到共同后缀。这时候突然发现,不需要开额外空间好像也是可以的!最重要的东西其实是len2和len1两个变量。

node* check(list str1,list str2)
{
	node*p,*q;
	p=str1->next;
	q=str2->next;
	int len1=0,len2=0;
	
	//求长度 
	while(p!=NULL) len1++,p=p->next;
	while(q!=NULL) len2++,q=q->next;
	
	//移动,尾对齐 
	for(q=str2->next;len2>len1;len2--) q=q->next;
	for(p=str1->next;len2<len1;len1--) p=p->next;
	
	while(p->next!=q->next&&p->next!=NULL)
	{
		p=p->next;
		q=q->next;
	}
	return p;//起始点 
}

时间复杂度:O(max(len1,len2)),空间复杂度O(1)

注:我并不追求把所有思路展示出来,更多是展示自己在拿到题目后的思路分析。


https://www.xamrdz.com/lan/5ne1948315.html

相关文章: