1. 程式人生 > >資料結構——演算法之(032)(求兩個串中的第一個最長子串)

資料結構——演算法之(032)(求兩個串中的第一個最長子串)

【申明:本文僅限於自我歸納總結和相互交流,有紕漏還望各位指出。 聯絡郵箱:[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;
}