给定一个长度为 n 的字符串 s 和一个长度为 m 的字符串 t
。
字符串 s
和 t 均由小写字母组成,字符串 s 的长度不超过字符串 t
的长度。
我们希望字符串 s
成为字符串 t
的子串。
为此,你可以进行任意次(也可以不进行)字符替换操作。
每次操作可以任选字符串 s
中的一个字符并将其替换为 ?
。
?
可以视为等于任何其它字符。
请你计算,为了使得字符串 s
成为字符串 t
的子串,所需进行的最少操作次数,并提供一种具体操作方案。
例如,如果 s
为 abd
,t 为 abcd
,那么我们可以进行一次操作,将 s 中的第 3 个字符替换为 ?
,替换后 s 变为 ab?
,可以与字符串 t
的子串 abc
匹配。
输入格式
第一行包含两个整数 n,m
。
第二行包含一个长度为 n
的由小写字母构成的字符串 s
。
第三行包含一个长度为 m
的由小写字母构成的字符串 t
。
输出格式
首先,输出一行,一个整数 k
,表示所需的最少操作次数。
如果 k=0
,则输出到此为止,不要输出多余空行。
如果 k≠0
,则还需再输出一行 k 个整数,其中第 i 个整数表示第 i
个操作所替换字符的位置编号。
s
中字符的位置从左到右依次编号为 1∼n
。
如果方案不唯一,输出任意合理方案均可。
数据范围
前 6
个测试点满足 1≤n≤m≤10。
所有测试点满足 1≤n≤m≤1000
。
输入样例1:
3 5
abc
daebf
输出样例1:
2
2 3
输入样例2:
4 10
abcd
fbcfabaecd
输出样例2:
1
2
枚举一下起点,看子串匹配度
因为在1000以内,用 O(n^2)就能过-------->暴力就行!!!
#include<bits/stdc++.h>
using namespace std;
int n, m;
string s, t;
vector<int> calc(int k)//求多少位数匹配
{
vector<int> res;//定义一个res来表示多少个位置不匹配
for (int i = 0; i < n; i ++ )
if (s[i] != t[i + k])
res.push_back(i);//不匹配就加进去
return res;
}
int main()
{
cin >> n >> m;
cin >> s >> t;
vector<int> res(n + 1);//答案要存方案,直接用vector
// 初始一个n+1的长度,一定比所有的大,一定会更新
for (int i = 0; i < m - n + 1; i ++ )//枚举一下起点的位置,最后要留下n个位置(m-(n-1))
{
auto p = calc(i);//求一下方案
if (p.size() < res.size())//判断是否是最小的
res = p;
}
cout << res.size() << endl;
for (auto x: res)//再输出一下位置
cout << x + 1 << ' ';//下标从1开始,所以为x+1
return 0;
}