对于输入的两个字符串 $s,t$,要修改 $s$ 中尽可能少的字符,使其能在字符串 $t$ 中被查找到。

直接想到最朴素的枚举算法,枚举字符串 $t$ 的左端点,因字符串 $s$ 的长度不变,所以右端点也能够同时被确定。然后每次判断当字符串 $s$ 修改为字符串 $t$ 中等长的某一段时,需要修改的字符数量,也就是两者不相同的字符的数量。当答案有更新的时候,同时记录下需要修改的每一个位置。

核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
for (int i = 1;i <= m - n + 1;++i)//枚举左端点,注意范围
{
int tot = 0;//计数器的初始化
for (int j = 1,k = i;j <= n;++j,++k)
if (a[j] != b[k]) ++tot;//两者不同的数量
if (tot < ans)//出现更优的答案
{
cnt = 0;ans = tot;//更新答案
for (int j = 1,k = i;j <= n;++j,++k)//依次记录每一个位置
if (a[j] != b[k]) num[++cnt] = j;
}
}