胖胖的小宋字符串大师

Description

经过两年多的算法学习,胖胖的小宋已经成为字符串大师了。

现在隔壁老段给了小宋两个长度都为 n 的字符串,让他来求它们的最长公共子串,但小宋同学感觉题目太简单(因为他已经成为字符串大师了),所以他把题目交给了你来完成,并给你了 k 次修改字母的机会,每次你可以选择其中某个串的某个位置,将其修改成任意字符。你需要合理使用这 k 次修改机会,使得修改之后两个串的最长公共子串最长。既然小宋同学选择了你,那么这个问题也难不倒你。

最长公共子串定义:对于字符串 A:"abcde",字符串 B:"jcdkl",它们的最长公共子串为串 "cd",即长度最长的字符串,且在两个串中都作为连续子串出现过。

Input

第一行包含两个整数 n,k (0<n≤300,0≤k≤n),分别表示字符串的长度和修改次数。

第二行包含一个长度为 n 的仅由小写字符构成的字符串 S。

第三行包含一个长度为 n 的仅由小写字符构成的字符串 T。

Output

输出一行一个整数,即修改完毕之后两个串的最长公共子串的长度。

Sample Input 1 

5 0

abcde

jcdkl

Sample Output 1

2

Sample Input 2 

5 2

aaaaa

ababa

Sample Output 2

5
#include <iostream>
#include <stdio.h>
#include <cstring>

using namespace std;

int i,j;
#define A 300+5
int main()
{
    int n,k;
    char a[A],b[A];

    cin>>n>>k;
    cin>>a>>b;

    int max=0,count=0;
    int x,y;

    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            for(x=i,y=j;x<n&&y<n;x++,y++)
            {
                if(a[x]!=b[y]) count++;

                if(count>k)
                {
                    count=0;
                    break;
                }

                if(max<x-i+1) max=x-i+1;  //
            }
        }
    }
    cout<<max<<endl;

    return 0;
}

                                                                                                                                                       ----------文章感谢学长题解

发布了113 篇原创文章 · 获赞 2 · 访问量 1541

猜你喜欢

转载自blog.csdn.net/C_Dreamy/article/details/103886994