最少前缀操作问题 | 豆包MarsCode AI 刷题

61 阅读2分钟

最少前缀操作问题

题目类型

思维题,模拟题

题意

  • 小U和小R有两个字符串,分别是S和T,现在小U需要通过对S进行若干次操作,使其变成T的一个前缀。
  • 操作可以是修改S的某一个字符,或者删除S末尾的字符。
  • 现在你需要帮助小U计算出,最少需要多少次操作才能让S变成T的前缀。

样例一:输入:S = "aba", T = "abb" 输出:1

样例二:输入:S = "abcd", T = "efg" 输出:4

样例三:输入:S = "xyz", T = "xy" 输出:1

样例四:输入:S = "hello", T = "helloworld" 输出:0

样例五:输入:S = "same", T = "same" 输出:0

题解

问题理解:

你需要通过对字符串 S 进行若干次操作(修改字符或删除字符),使其变成字符串 T 的一个前缀。 目标是计算出最少需要多少次操作。

这个题目因为是匹配前缀,那么可以发现在遍历 S 的时候,如果遇到和 T 的前缀不一样,那么花费一次操作删除S的当前字符对结果没有贡献,而同样花费一次操作直接修改S当前字符更优,这样就可以用双指针遍历两个字符串,遇到不一样的就增加操作次数,遍历结束后,如果 T 的指针没有到达末尾,说明 S 的长度不够,需要删除剩余的字符。

数据结构选择:

使用两个指针分别遍历字符串 S 和 T。 一个指针用于遍历 S,另一个指针用于遍历 T,并记录匹配的位置。

算法步骤:

  1. 初始化两个指针 index 和 operations。
  2. 遍历字符串 S,逐个字符与 T 中的字符进行比较。
  3. 如果字符匹配,则移动 T 的指针。
  4. 如果字符不匹配,则增加操作次数。
  5. 遍历结束后,如果 T 的指针没有到达末尾,说明 S 的长度不够,需要删除剩余的字符。
#include <iostream>
#include <string>
using namespace std;

int solution(string S, string T) {
    int id = 0, res  = 0;
    for(auto x : S) {
        if(id >= T.size()) {
            res++;
        }
        else if(x == T[id]) {
            id++;
        }
        else res++, id++;
    }
    return res;
}