1. 程式人生 > >135、程式設計實現:找出兩個字串中最大公共子字串,如"abccade","dgcadde"的最大子串為 "cad"

135、程式設計實現:找出兩個字串中最大公共子字串,如"abccade","dgcadde"的最大子串為 "cad"

35、程式設計實現:找出兩個字串中最大公共子字串,如"abccade","dgcadde"的最大子串為
"cad"

/*
35、程式設計實現:找出兩個字串中最大公共子字串,如"abccade","dgcadde"的最大子串為
"cad"

不同於56的最長公共子串 
DP題演算法導論上有:
c[i,j]=0                      i=0||j=0
	  =c[i-1,j-1]+1           a[i]==a[j]
	  =max(c[i-1,j],c[i,j-1]) a[i]!=a[j]	

本題 就是迴圈列舉 
*/

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
using namespace std;

int GetCommon(char s1[], char s2[])
{
	int len1=strlen(s1);
	int len2=strlen(s2);
	int r,maxlen=0;
	
	for(int i=0;i<len1;i++)
	{
		for(int j=0;j<len2;j++)
		{
			if(s1[i]==s2[j])
			{
				int as=i,bs=j,count=1;
				while(as+1<len1&&bs+1<len2 &&s1[++as]==s2[++bs])
					count++;
				if(count>maxlen)
				{
					maxlen = count;
					r=i;
				}
			}
		}
	}
	for(int i=r;i<r+maxlen;i++)
		printf("%c",s1[i]);
	printf("\n");
	return maxlen;
}
int main()
{
	char a[]={"abccade"};
	char b[]={"dgcadde"};
	printf("%s和%s的最長公共子串是:\n",a,b);
	printf("長度為:%d\n",GetCommon(a,b));
	
	return 0;
}