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

225 阅读3分钟

问题描述

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

测试样例

样例1:

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

样例2:

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

问题解析

分析问题可知:要解决的问题是,计算将字符串S修改为字符串T的前缀子串所需要的操作的数目,注意:修改后的字符串S可以与字符串T相同。

解题思路

  1. 初始化两个变量l1和l2,分别表示字符串S和字符串T的长度。这两个变量将帮助我们确定遍历字符串的边界。

  2. 创建一个计数器count,用于记录操作次数。这个计数器是我们最终要返回的结果,它表示将字符串S变为字符串T前缀所需的最小操作次数。

  3. 使用两个指针i和j分别遍历字符串S和字符串T。指针i指向字符串S的当前字符,指针j指向字符串T的当前字符。

  4. 进入while循环,循环条件是i<l1且j<l2。这意味着只要两个指针都没有达到各自字符串的末尾,我们就可以继续比较和操作。

  5. 在循环内部,比较字符串S的第i个字符和字符串T的第j个字符。如果它们不相等,说明字符串S的当前字符不能成为字符串T的前缀的一部分,因此我们需要进行一次修改操作,计数器count加1。

  6. 无论字符是否相等,两个指针都需要向前移动一位,以便比较下一个字符。

  7. 当while循环结束时,我们需要处理两种情况:

    • 如果指针i等于l1,说明字符串S的所有字符都已经与字符串T的前j个字符进行了比较。此时,字符串S已经尽可能地接近字符串T的前缀,无需进一步操作。
    • 如果指针j等于l2,说明字符串T的所有字符都已经与字符串S的前i个字符进行了比较,或者字符串S已经完全匹配了字符串T的前缀。在这种情况下,我们同样不需要进行任何操作。
  8. 如果指针i小于l1,说明字符串S中还有剩余的字符没有与字符串T的字符进行比较。这些剩余的字符都不能成为字符串T的前缀,因此我们需要将它们删除。删除操作的数量等于剩余字符的数量(l1 - i),将这些数量加到计数器count上。

  9. 最后,返回计数器count的值,它表示将字符串S变为字符串T前缀所需的最小操作次数。

代码实现

int solution(string S, string T) {
    int l1 = S.size();
    int l2 = T.size();
    int count = 0;
    int i=0,j=0;
    while(i<l1&&j<l2){
        if(S[i] != T[j])
            count++;
        i++;
        j++;
    }
    if(i<l1)
        count += l1-i;
    return count;
}