给定一字符串,该字符串中存在若干对相同的字符,设计一个在时间和空间上尽可能高效的算法,找出一对相同字符在该字符串中的最大距离。例如:“KLabcLdecL”,其中第一个“L”和最后一个“L”相距最远,它们在原字符串中的位置相差8,要求:
问答题
给出算法的基本设计思想。
【正确答案】正确答案:基本设计思想:在遍历字符数组的过程中,对已经访问过的字符进行标记,同时记下它们第一次出现在原字符串中的位置,当以后再次遍历到此字符时,根据当前的位置和第一次出现的位置,求出它们之间的距离,然后用得到的距离和当前最大距离相比较。为此需要设置一个数组用来存放已经访问过的字符,为了能加快搜索,采用字符的ASCⅡ码作为数组的下标来支持随机访问,通过对应下标中的数组元素的访问标记is_access来判断它是否被访问过,另外还要获取它第一次出现的位置,很明显这里的数组元素应设置为结构体类型,每遍历一个字符就开始判断,并更新最大距离。
【答案解析】
问答题
根据设计思想,采用C、C++或Java语言描述算法,关键之处给出注释。
【正确答案】正确答案:算法实现如下: typedef struct element //定义字符的访问标记和位置信息 { bool is access; //表示该字符是否被访问过 int position; //记录下该字符第一次出现的位置 }array[128]; //字符的ASCⅡ值范围为0~127 int get_max len(char str[],int n) //n为字符数组的长度 { int max=0; //初始化相同字符间的最大距离 int i=0; while (i<n) { if(array[str[i]j.is access==false) //如果该字符第一次出现 { array[str[i\]\].position=i; //记下第一次出现的位置 array[str[i\]\].is_access=true; //置标记信息为已访问 } else //该字符不是第一次出现 { 1f(i—array[str[i\]\].position>=max) //两字符距离比当前最大值大 { max=i—array[str[i\]\].position; //更新最大值 } } i++; } return max; }
【答案解析】
问答题
说明你所设计算法的时间复杂度和空间复杂度。
【正确答案】正确答案:时间复杂度分析:整个算法过程相当于把数组遍历了一遍,所以时间复杂度为O(n)。 空间复杂度分析:算法中最多只需要使用128个数组元素,所以空间复杂度为一常数,表示为O(1)。
【答案解析】