資料結構——演算法之(032)(求兩個串中的第一個最長子串)
阿新 • • 發佈:2019-01-04
【申明:本文僅限於自我歸納總結和相互交流,有紕漏還望各位指出。 聯絡郵箱:[email protected]】
題目:
求兩個串中的第一個最長子串(神州數碼以前試題).如"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; }