期末复习四——串、数组、广义表

BF匹配

在这里插入图片描述

众所周知,越暴力越简单,同时时间复杂度也越差劲,不动脑子的方法,把一切都交给机器,那人家就是要慢慢跑,气死你。所以为了不被气死👿,我们还是用优秀的方法给机器省点力气吧🦄(能量守恒原理处处适用)
反思一下我们BF之所以慢是因为每次发现不匹配之后主串指针i都要回溯到梦开始的地方的下一个,导致非常不优秀的复杂度O(m*n)👎,那么,如果我们通过研究模式串的套路,可不可以让i不会退,给我们提升到O(m+n)的优秀复杂度呢👍?
那么这里就要隆重介绍一个叫做next数组的东西,用它来帮助我们分析模式串。
在这里插入图片描述

可能对于第一种情况你还是一脸懵逼🙇‍♀️,没事,接下来我来讲解怎么处理第一种情况🧐
举个栗子——
在这里插入图片描述

在这里插入图片描述
聪明如你,一定发现了这和我们呢刚刚写的BF大同小异,唯二的区别在执行i,j指针后移的条件多了一个j==0以及else之后的语句,i不再回退到这次比较开始的下一个位置,j也不再回到1而是回到next[j]的位置。
在这里插入图片描述

但是偶尔我们发现主串为aaaab,模式串为aab的时候还是很慢,所以改进next数组为nextval数组——
在这里插入图片描述
在这里插入图片描述

错题

啊哈哈哈哈哈哈什么?为什么没有数组和广义表?这个太简单了,自行体会~
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这种下标变异题要格外小心。而且注意本题一个数据占据两个单元。

在这里插入图片描述好题实现字符串的逆置并不难,但本题“要求不另设串存储空间”来实现字符串逆序存储,即第一个输入的字符最后存储,最后输入的字符先存储,使用递归可容易做到。

void InvertStore(char A[])
//字符串逆序存储的递归算法。
{
	char ch;
	static int i = 0;//需要使用静态变量
	cin>>ch;
	if (ch!=.) //规定’.'是字符串输入结束标志
	{
		InvertStore(A);
		A[i++] = ch;//字符串逆序存储,操作放在递归的后面
	}
	A[i] = ‘\0; //字符串结尾标记
}

在这里插入图片描述

int max(int a[],int start, int end){
    if(start==end) return a[start]; //出口
    else{
        mid = (start+end)/2; //取个中
        m = max(a,start,mid); //左边喜刷刷
        n = max(a,mid+1,end); //右边喜刷刷
        return m>n?m:n; //求个大
    }
}

在这里插入图片描述
像这种题目不会需要你写链表的定义初始化啥的,上来就默认已经有链表了,淦就完事。【和上面那个逆序存储是同类题目】

void reverse_print(LinkList head){
    if(!head)
        return;
    else{
        reverse_print(head->next);//先推到最后
        printf(head->data);//逆序的话操作放后面
   }
}

在这里插入图片描述
属于排序问题,只是排出正负,不排出大小,考虑双指针,可在数组首尾设两个指针i和j,i自小至大搜索到负数停止,j自大至小搜索到正数停止。然后i和j所指数据交换,继续以上过程,直到 i=j为止。

void Arrange(int A[],int n)
//n个整数存于数组A中,本算法将数组中所有正数排在所有负数的前面
{
	int i=0,j=n-1,x; //用类C编写,数组下标从0开始
	while(i<j)
	{
		while(i<j && A[i]>0) i++;//停在负数上
		while(i<j && A[j]<0) j–;//停在正数上
		if(i<j) {x=A[i]; A[i++]=A[j]; A[j--]=x; }//交换A[i] 与A[j]
	}
}

在这里插入图片描述
在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页