5 最长公共子串 (100分)
给定两个字符串a、b,现有k次机会对字符串中的字符进行修改,使修改后两个字符串的最长公共子串最长。每一次修改,可以选择a、b字符串中某一个串的任意位置修改成任意字符。
输入格式:
第一行包括一个正整数 k。
第二行和第三行分别输入字符串a、b。(每个串的长度不超过500)
输出格式:
输出为一个整数,表示修改后的两个串的最长公共子串长度。
输入样例:
5
aaaaa
bbbbb
输出样例:
5
Accepted
#include <stdio.h>
#include <string.h>
int main()
{
int k,i,j,len1,len2,t1,t2,sum,time,max=-1;
char s1[505],s2[505];
scanf("%d",&k);
scanf("%s",&s1);
scanf("%s",&s2);
len1=strlen(s1);
len2=strlen(s2);
for(i=0;i<len1;i++)
for(j=0;j<len2;j++)
{
t1=i;
t2=j;
sum=0;
time=k;
while(t1<len1&&t2<len2)
{
while(t1<len1&&t2<len2&&s1[t1]==s2[t2])
{
t1++;
t2++;
sum++;
}
if(time>0)
{
t1++;
t2++;
sum++;
time--;
}
else
break;
}
if(sum>max)
max=sum;
}
printf("%d",max);
return 0;
}
a[0],b[0]为头,遍寻找出这俩为头起初的最大公子串,然后a[0],b[1]...然后a[1],b[0]..以此类推,全部的sum的最大值即为最大公子串。