数据结构——算法之(032)(求两个串中的第一个最长子串)
2014-06-17 09:44
253 查看
【申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出。 联系邮箱:Mr_chenping@163.com】
题目:
求两个串中的第一个最长子串(神州数码以前试题).如"abractyeyt","dgdsaeactyey"的最大子串为"actyey".
题目分析:
1、这里只是实现了简单的字符串算法(最大支持字符串长度64),主要是展示算法思想
2、思路是把2个字符串每个字符的匹配关系,映射到一张二维数组表中,匹配写1,非匹配写0
算法实现:
题目:
求两个串中的第一个最长子串(神州数码以前试题).如"abractyeyt","dgdsaeactyey"的最大子串为"actyey".
题目分析:
1、这里只是实现了简单的字符串算法(最大支持字符串长度64),主要是展示算法思想
2、思路是把2个字符串每个字符的匹配关系,映射到一张二维数组表中,匹配写1,非匹配写0
算法实现:
#include <stdio.h> #include <string.h> #include <stdlib.h> /* ** 最长支持的字符串大小 */ #define MAX_SIZE 64 /* ** 解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的 ** 匹配情况,若是匹配则为1,否则为0,然后求出对角线最长的1序列,其 ** 对应的位置就是最长匹配子串的位置. */ char *str_max_match(const char *s1, const char *s2) { if(!s1 || !s2) return 0; int l1 = strlen(s1); int l2 = strlen(s2); int M[MAX_SIZE][MAX_SIZE] = {0}; int i = 0, j = 0, max_len = 0, end = 0; for(i=0; i<l1; ++i) { for(j=0; j<l2; ++j) { if(s1[i] == s2[j]) { if(i == 0 || j == 0) M[i][j] = 1; else M[i][j] = M[i-1][j-1] + 1; } /*record the max len*/ if(M[i][j] > max_len) { max_len = M[i][j]; end = i; } } } int start = end - max_len + 1; #if 0 char *re = calloc(1, max_len + 1); for(i=start; i<=end; ++i) re[i-start] = s1[i]; #else char *re = strndup(s1 + start, max_len); #endif return re; } int main(int argc, char *argv[]) { char *re = str_max_match(argv[1], argv[2]); printf("%s---->%s<-----%s\n", argv[1], re, argv[2]); free(re); return 0; }
相关文章推荐
- 数据结构——算法之(032)(求两个串中的第一个最长子串)
- 【数据结构与算法】万恶的最长回文子串
- 【数据结构与算法】最长公共子串 最长公共子序列
- 【数据结构与算法】最长、短回文子串问题
- 求两个串中的第一个最长子串
- Suffix Trees 求两个串中的第一个最长子串
- 求两个串中的第一个最长子串(神州数码以前试题)。
- 数据结构课程设计---最长公共子串
- 数据结构:题目(5)找两个字符串的最长公共子串(非递归实现方法)
- 数据结构课程设计---最长公共子串
- 求两个串中的第一个最长子串
- 数据结构与算法学习之路:LIS——最长递增序列的动态规划算法和二分思想算法
- 数据结构——算法之(025)( 求一个数组的最长递减子序列)
- 求两个串中第一个最长的子串 神州数码
- 两个串中的第一个最长子串
- 求两个串中的第一个最长子串,如"abractyeyt"和"dgdsaeactyey"的第一个最长字串是"actyey"
- 求串s中出现的第一个最长重复子串及其位置
- LCS的java算法---考虑可能有多个相同的最长公共子串
- 数据结构与算法(C#实现)系列---AVLTree(二)(外摘)
- 数据结构知识——树的三种不同遍历算法解析