首页 > 编程知识 正文

最长子序列算法,最大公共字符串

时间:2023-05-04 12:31:36 阅读:160777 作者:3459

3 % E3 % 81 % a4 % E3 % 81 % AE % E6 % 96 % B9 % E6 % B3 % 95 % E3 % 81 % af % E5 % 8f % 82 % E8 % 80 % 83 % E3 % 81 % ab % E3 % ab % E3 % ab % E3 % 95 % 95 % 95 % E3 % E3 % E3 % % 89 % E3 % 81 % AE % e9 % 83 % A8 % E5 % 88 % 86 % E3 % 81 % af % E8 % 87 % aa % E5 % 88 % 86 % E3 % 81 % a7 % E6 % 9b % b8 % be % 8c % E3 % 81 % AE % E5 % AE % 9f % E8 % a1 % 8c % E7 % b5 % 90 % E6 % 9e % 9c % E3 % 81 % af % E3 % 81 % 99 % E3 % 81 % B1 % B3 % 81 % B3 % b5 % b5 3 % 81 % 9d % E3 % 81 % AE % e9 % 81 % 8e % E7 % A8 % 8b % E3 % 81 % a7 % E8 % 80 % 83 % E6 % 85 % AE % E3 % 81 % 8c % E4 % b8 % E3 % 81 % A8 % E3 % 81 % af % e9 % 81 % BF % E3 % 81 % 91 % E3 % 82 % 89 % E3 % 82 % 8c % E3 % 81 % be % E3 % 81 % 9b % E3 % 8b % E3 % 81 % ab % E8 % aa % a4 % E3 % 82 % 8a % E3 % 81 % 8c % E3 % 82 % 8c % E3 % 81 % B0 % E3 % 80 % 80 % 81 % E1 % E3 1 % a6 % E3 % 81 % 84 % E3 % 81 % be % E3 % 81 % 99 % E3 % 80 % 82 % 20 % E5 % 90 % 8c % E6 % 99 % 82 % E3 % 81 % ab % E6 % 96 % E3 % 82 % 8c % E3 % 81 % B0 % E3 % 80 % 81 % E6 % 8f % 90 % E5 % 87 % ba % E3 % 81 % 99 % E3 % 82 % 8b % E3 % 81 % 93 % E3 % ba ba % 8f % E6 % a7 % 8b % e9 % 80 % A0 % E3 % 81 % AE % E3 % 83 % a1 % E3 % 83 % aa % E3 % 82 % B9 % E3 % 83 % 83 % a3 % E3 % 83 % aa 3 % 82 % B9 % E3 % 83 % 88 % E3 % 83 % aa % E3 % 83 % B3 % E3 % 82 % b0s % E3 % 81 % A8 % E3 % 82 % B9 % E3 % 83 % 88 % E3 % 88 % E3 % 83 % 83 % E3 % 83 % E3 % 83 % 83 % B3 % B3 A8 % E5 % 88 % 86 % E3 % 82 % B9 % E3 % 83 % 88 % E3 % 83 % aa % E3 % 83 % B3 % E3 % 82 % B0 % E3 % 82 % 92 % E6 % B1 % 82 % E2 % aa a % E4 % ba % 8c % E6 % AC % a1 % E5 % 85 % 83 % e9 % 85 % 8d % E5 % 88 % 97 % E3 % 82 % 92 % E5 % 88 % a9 % E7 % 94 % A8 % E3 % E3 % 86 % E5 % 88 % 97 % E3 % 81 % AE % E6 % 9c % 80 % E5 % be % 8c % E3 % 81 % AE % E6 % 96 % 87 % ad % 97 % E3 % 81 % 8c % 3 % 81 % 82 % E3 % 82 % 8b % e9 % 85 % 8d % E5 % 88 % 97 % E6 % B7 % bb % E5 % ad % 97 % E3 % 82 % E6 % B1 % 82 % E3 % 82 % E3 % 82 % 20 % E3 % 81 % 93 % E3 % 81 % AE % E3 % 81 % A8 % E3 % 81 % 8d % E3 % 80 % 81s % E3 % 81 % 82 % 89 % E6 % 9c % 80 % % 82 % 8a % E5 % 87 % ba % E3 % 81 % 97 % E3 % 81 % a6 % E3 % 82 % 82 % 82 % E3 % 88 % E3 % 81 % 84 % E3 % 81 % 97 % E3 % 80 % E3 % 80 % a6 % a6 % E3 % 80 % 80 % 80 % 80 % E3 % 8 % E3 % 82 % 88 % E3 % 81 % 84 % E3 % 80 % 82 % 20 sqstringmaxcomstr % ef % BC % 88sq strings % ef % BC %8csq string % 20t % ef % xsize % 5d % ef % BC % 9b % 20 int % 20i % ef % BC % 8ck % ef % BC %8cmaxi % 5b2% 5d % ef % BC % 8c maxlen % 200 c % 9b % 20i % ef % BC % 89 for % ef % BC % 89j % 3d0% ef % BC % 9b % 20j % 20t.length % ef % BC % 9b % 20j % ef % BC % 89if % 89if 7c % 7cj % 3d % 3d0% ef % BC % 89 arr % 5bi % 5d % 5bj % 5d % 20 % 3d % 201 % ef % BC % 9b % 20 else %7Barr % 5bi % 5d % 5bj % 5d % 5bj % 5d % ef % BC % 88 arr % 5bi % 5d % 5bj % 5d maxlen % ef % BC % 89 % 7b maxlen % 20 % 3d % 20 arr % 5bi % 5d % 5bj % 5d % ef % BC % 9b % 20 %7dprintf % ef % BC % 88 % ef % BC % 88ni % 3d % 25dj % 3d % darr % 3d % 25d % ef % BC % 89 % ef % BC % 8ci % ef % BC % bi % 5d % 5bj % 5d % 20 % 3d % 200 % ef % BC % 9b % 20 % 7d else % 20 arr % 5bi % 5d % 5bj % 5d % 20 % 3d % 200 % ef % BC % 9b % 8 % ad % E3 % 81 % AE % E6 % 9c % 80 % E5 % a4 % a7 % E5 % 80 % a4 % E3 % 81 % AE % E8 % a1 % 8c % E7 % 95 % aa % E5 % 8f % B7 89 % E3 % 80 % 81 maxi % ef % BC % 880 % ef % BC % 89 % E3 % 80 % 81 maxi % ef % BC % 891 % ef % BC % 9b % 20 % 20 % 20 % E3 % 81 % 99 % E3 % 82 % 8b % ef % BC % 88i % 3d0% ef % BC % 9b % 20i % 20s.length % ef % 9b % 20i % ef % BC % 89 for BC % 88 % 27-% 27 % ef % BC %8carr % 5bi % 5d % 5bj % 5d % ef % BC % 9b % 20 printf % ef % BC % 88 % ef % BC % 88n % ef % BC ad % 97 % E5 % 88 % 97 % E3 % 82 % B3 % E3 % 83 % BC % E3 % 83 % 89 % E3 % 81 % AE % E4 % ba % 8c % E8 % 80 % 85 % E6 % 8a % 96 % 8a % 99 f % BC % 88 % E8 % a1 % 8c % E7 % 95 % aa % E5 % 8f % B7 % E5 % 88 % 87 % E3 % 82 % 8a % 85 % E5 % 8f % 96 % E3 % 82 % 8a % 2f % E5 for % ef % BC % 89k % 3d max len-1 % ef % BC % 8ci % 20 % 3d % 20 % 20 % 3d % 20 % 20 % 5b0% 5d % ef % BC % 9b % 20k % 20 % 200 % ef % BC % E5 % 88 % 97 % E3 % 81 % 8b % E3 % 82 % 89 % E5 % 88 % 87 % E3 % 82 % 8a % E5 % 87 % ba % E3 % 81 % 99 %7bstr.data % 5bk 0 % 7d % 2a % 2f for % ef % BC % 88k % 3d max len-1 % ef % BC % 8ci % 20 % 3d % 20 maxi % 5b1% 5d % ef % BC % 9b % 20k % 20 % 30 % 20 k % 30 % E3 % 81 % a7t % E5 % 88 % 97 % E3 % 81 % 8b % E3 % 82 % 89 % E5 % 88 % 87 % E3 % 82 % 8a % E5 % 87 % ba % E3 % 81 % 99 %7bssb

每个元素进行比较 ①发现s的data[1]与t中data[9]的字符相等,此时再比较串s和串t的下一个字符(即s的data[2](字符‘n’)与t的data[10](字符’n’)进行比较)。②发现此时两个字符依然相等,再比较两个串的下一个字符(即s的data[3](字符‘v’)与t的data[11](字符’s’)进行比较)。此时发现两个字符不相等,此时串s和串t都不再后移。此轮中有两个字符相等,count=2。③由于①中s.data[1]与t.data[9]已经比较过了,此时让s.data[1](字符’o’)与t.data[10](字符’n’)比较,两个字符不相同,让s.data[1](字符’o’)与t.data[11](字符’s’)比较,两个字符依然不相同。此时t串已到末尾,此轮结束。
串s的data[2](字符’n’)逐个和串t的每个元素进行比较 ①发现s的data[2]与t中data[1]的字符相等,此时再比较串s和串t的下一个字符(即s的data[3](字符‘v’)与t的data[2](字符’s’)进行比较)。此时发现两个字符不相等,串s和串t都不再后移。②由于①中s.data[2]与t.data[1]已经比较过了,此时让s.data[2](字符’n’)与t.data[2](字符’s’)比较,两个字符不相同,让s.data[2](字符’n’)与t.data[3](字符’t’)比较,两个字符依然不相同,继续此操作。③发现s的data[2]与t中data[10]的字符相等,此时再比较串s和串t的下一个字符(即s的data[3](字符‘v’)与t的data[11](字符’s’)进行比较)。此时发现两个字符不相等,串s和串t都不再后移。④由于③中s.data[2]与t.data[10]已经比较过了,此时让s.data[2](字符’n’)与t.data[11](字符’s’)比较,两个字符不相同,此时t串已到末尾,此轮结束。
运行结果

时间复杂度:O(nm) (BF算法的时间复杂度)空间复杂度:O(1) (除了str[ ],未开辟新空间)
其中n,m分别为s串和t串的长度。 方法三 算法思想:将较短串的头部和长串的尾部对齐,逐渐移动短串,比较重叠部分的字符串中的最长公共子串的长度,直到短串和长串的头部对齐。 SqString MaxComStr(SqString s, SqString t){SqString str;int i = 0, j, k, n = 1, m = s.length;int count = 0, index[2] = {0,0}, num = 0;while (n<=s.length) //循环的轮数由长串决定{i = --m; //每趟比较开始时,长串的起始下标j = 0; //每趟比较开始,短串的起始下标都为0if (i > s.length - t.length) k = s.length - i; //如果短串尾和长串尾没对其,每趟中需要比较的次数依次递增else k=t.length; //一旦短串尾和长串尾对其,之后的每一趟,比较次数都由短串决定while (k > 0) //k为每趟中需要比较次数{if (s.data[i] == t.data[j]) count++; //如果纵向对应的两个字符相等,公共子串的长度+1i++; j++; //依次比较每个纵向对应的两个字符if (s.data[i-1]==t.data[j-1]&&s.data[i] != t.data[j]) //如果前一个纵向的两个字符相等,但下一个纵向的两个字符不相等,即字符不连续相等{if (count > num) //记录最长的连续公共字符{num = count; //记录断开前的最长公共子串的长度index[0] = i - count; //最长公共子串在长串中的起始下标index[1] = index[0] - m; //最长公共子串在短串中的起始下标}count = 0; //每次发现字符不连续相等时,需要重新计数,然后再比较断开前后的长度,取最大值}k--; //每比较一次,剩余需要比较的次数减少}n++; //比较的总趟数减1}for (i = 0, j = index[0]; i < num; i++, j++)str.data[i] = s.data[j];str.length = num;printf("n最长公共子串在长串中的起始下标为:%dn在短串中的起始下标为:%dn最长公共字串的长度为:%d", index[0], index[1], num);printf("n最长公共子串为:");DispStr(str);return str;} 分析 该算法只需纵向比较对应位置即可,斜对角的位置可不用比较。如在图中,第二轮比较s.data[12]==t.data[0]?、s.data[13]==t.data[1]?而s.data[12]==t.data[1]?会在下一轮中进行比较;而s.data[13]==t.data[0]?已经在上一轮中比较完毕。
从图中可以分析出,总共需要比较14轮(14为较长串的长度),而最坏情况下,第一轮比较1次,第二轮比较2次…第十二轮比较12次(此时两个串尾对齐)。此时离14轮还差两轮,而剩下的两轮比较的次数都是12(即较短串的长度)。

实现步骤:

定义一个变量n(用来表示总共需要比较多少轮),比较的轮数由长串的长度决定。每比较一轮,让n++。定义一个变量m(用来表示每一轮中,长串开始比较的起始下标),m的初始值为长串的长度,每一轮中先让m减1之后再开始比较。定义两个变量i(表示每次比较时,长串的起始下标),j(表示每次比较时,短串的起始下标),从图中可以看出,j每次都是比较的范围都是0~m-1,而i可以表示为–m。定义变量k(用来表示每轮循环需要比较次数),每轮比较开始,k=m,每一轮中每比较一次,k–。定义变量count(用来统计每轮中重复字符的个数)定义变量num(最长公共子串的长度)和index(最长公共子串的起始下标)


运行结果

时间复杂度: 1 + 2 + . . . + n + ( n − m ) m 1+2+...+n+(n-m)m 1+2+...+n+(n−m)m空间复杂度:O(1)
其中n,m分别为s串和t串的长度。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。