Message

Message

思路

一开始的思路就是暴力匹配,数据只有 \(2000\) 最大嘛,先是把s串作为文本串,u作为模式串取匹配,过了样例交一发,看着测评机跑到了25,突然就停了,果真没这么简单,wa了一发,然后想一下,如果两个互换位置再匹配一次行不行,没想到还真过了。

乱搞过了,还是把道理给搞清楚吧。

首先我们应该保证不会删除两端的字母,这一步对我们的变换是没有任何贡献的,所以,我们只剩下两种操作,在两头添加字母,或者改变序列的字母。

简单的模拟几个样例后我们发现。

对于把s作为文本串,选取一个匹配度最大的段,接下来我们的操作是改变序列的字母,或者在后端添加字。

对于把u作为文本串,我们的操作就是选取一个匹配度最大的位置,然后在两头添加字母或者改变序列的子字母。

其实这两个做的都是同一个工作,就是在s中找到一个串,其在u中的匹配度是最大的,对于我们的第一次操作,得到的是s的后半段中与u匹配度最大的部分,第二次操作得到的是s的整个段或者是前段中与u匹配读最大的。

这两次匹配没想到竟然把所有的情况都考虑完了,而我却碰巧A了这题。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;

char a[N], b[N];

int main() {
    // freopen("in.txt", "r", stdin);
    scanf("%s %s", a + 1, b + 1);
    int la = strlen(a + 1), lb = strlen(b + 1), maxn = 0;
    for(int i = 1; i <= la; i++) {//a作为文本串
        int now = (a[i] == b[1]);
        for(int j = 1; j + 1 <= lb && i + j <= la; j++)
            now += (a[i + j] == b[j + 1]);
        if(now > maxn)  maxn = now;
    }
    for(int i = 1; i <= lb; i++) {//b作文文本串
        int now = (b[i] == a[1]);
        for(int j = 1; j + 1 <= la && i + j <= lb; j++)
            now += (b[i + j] == a[j + 1]);
        if(now > maxn)  maxn = now;
    }
    printf("%d\n", lb - maxn);//暴力匹配两次还真能过。
    return 0;
}

原文链接: https://www.cnblogs.com/lifehappiness/p/12826550.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    Message

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/346294

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午3:49
下一篇 2023年3月2日 上午3:49

相关推荐