这道模拟题,我做不出来啊,有没有人看看

题目描述
AC鸭有两个字符串 s 和 t,他想要更改字符串 s 中的一些字符,使他可以在 t 中找到 s 作为子字符串。所有更改的要求是:在字符串 s 中选择一个字符,并用问号”?“替换它,之后这个问号可以表示任何字符。例如,如果他更改后的字符串 s=“ab? b”,它可以是字符串 t=“aabrbb”的子字符串。确保字符串 s 的长度不超过字符串的长度。帮助AC鸭替换尽可能少的字符,以便 s 可以在中作为子字符串找到。

输入
第一行包含两个整数 n 和 m (1≤n≤m≤1000) 代表字符串 s 的长度和字符串 t 的长度。

第二行包含n个小写英文字母的字符串 s。 第三行包含m个小写英文字母的字符串 t。

输出
在第一行中,打印单个整数 k 代表需要替换的最少字符数。

在第二行中,按顺序打印 k 个不同的整数,这些整数表示需要替换的字符在字符串 s 中的位置。位置编号从 1 开始,如果有多种方案的替换数都是最少的,输出最先与字符串匹配(匹配的子串在中出现位置最靠左)的更改方案。

输入数据 1
3 5
abc
xaybz
输出数据 1
2
2 3
输入数据 2
4 10
abcd
ebceabazcd
输出数据 2
1
2

/*O(n**2)
选取t中的一个字符串作为我们字符串的开头,然后依次遍历,找出需要修改的字符串最短的。 
*/
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
    int m,n;
    string s,t;
    cin>>m>>n;
    cin>>s>>t;
    int minn=1100,bg=0;
    for(int i=0; t[i]; i++) {   #选取的字符串以i开头 
        int cnt=0;
        for(int j=0; s[j]; j++) {
            if(t[i+j]!=s[j]) {
                cnt++;    #以i开头的字符串,有cnt个跟s匹配不上 
            }
        }
        if(cnt<minn) {
            minn=cnt;
            bg=i;    #bg就是最少匹配的字符串是以bg开头的 
        }
    }
    cout<<minn<<endl;
    for(int i=bg,j=0;s[j];i++,j++)
    {
        if(t[i]!=s[j])
        cout<<j+1<<" ";
    }
    return 0;
}
/*
3 5
abc
xaybz

4 10
abcd
ebceabazcd
*/

【以下回答由 GPT 生成】

解决方案

这道题要求我们将字符串s中的一些字符替换为问号"?",使得s能够在字符串t中作为子字符串找到,并且替换的字符数要尽可能少。

首先,我们需要找到s中需要替换的字符。对于每个位置i,如果s[i] != t[i],则需要将s[i]替换为问号"?"。我们可以遍历s和t的每个位置,比较字符是否相等,然后统计需要替换的字符数和位置。

接下来,我们需要找到最小替换字符数的方案。如果存在多种方案且替换数都是最少的,则输出最先与字符串匹配的子串在t中出现位置最靠左的更改方案。

我们可以按照上述步骤,使用C++来实现解决方案。具体代码如下:

#include <iostream>
#include <vector>

using namespace std;

vector<int> minimumReplacement(string s, string t) {
    int n = s.length();
    int m = t.length();

    int minReplacement = m - n;  // 最小替换字符数
    vector<int> positions;  // 需要替换的字符位置

    for (int i = 0; i <= m - n; i++) {
        int replacement = 0;  // 当前方案的替换字符数

        for (int j = 0; j < n; j++) {
            if (s[j] != t[i+j]) {
                replacement++;
                positions.push_back(j+1);
            }
        }

        if (replacement < minReplacement) {
            minReplacement = replacement;
            positions.clear();  // 清空之前的方案
        }
    }

    vector<int> result;
    result.push_back(minReplacement);
    for (int pos : positions) {
        result.push_back(pos);
    }

    return result;
}

int main() {
    int n, m;
    string s, t;

    cin >> n >> m;
    cin >> s >> t;

    vector<int> result = minimumReplacement(s, t);

    cout << result[0] << endl;
    for (int i = 1; i < result.size(); i++) {
        cout << result[i] << " ";
    }
    cout << endl;

    return 0;
}

在上述代码中,我们定义了一个minimumReplacement函数,它接受字符串s和t作为输入,返回一个包含最小替换字符数和替换的字符位置的vector。我们在main函数中读取输入数据,并调用minimumReplacement函数来解决问题,最后按照输出格式将结果打印出来。

再次强调,以上代码是一个解决方案示例,可能需要根据具体情况进行调整和优化。如果你有任何问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^