问题描述
小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相同。
解题思路
-
初始化两个变量l1和l2,分别表示字符串S和字符串T的长度。这两个变量将帮助我们确定遍历字符串的边界。
-
创建一个计数器count,用于记录操作次数。这个计数器是我们最终要返回的结果,它表示将字符串S变为字符串T前缀所需的最小操作次数。
-
使用两个指针i和j分别遍历字符串S和字符串T。指针i指向字符串S的当前字符,指针j指向字符串T的当前字符。
-
进入while循环,循环条件是i<l1且j<l2。这意味着只要两个指针都没有达到各自字符串的末尾,我们就可以继续比较和操作。
-
在循环内部,比较字符串S的第i个字符和字符串T的第j个字符。如果它们不相等,说明字符串S的当前字符不能成为字符串T的前缀的一部分,因此我们需要进行一次修改操作,计数器count加1。
-
无论字符是否相等,两个指针都需要向前移动一位,以便比较下一个字符。
-
当while循环结束时,我们需要处理两种情况:
- 如果指针i等于l1,说明字符串S的所有字符都已经与字符串T的前j个字符进行了比较。此时,字符串S已经尽可能地接近字符串T的前缀,无需进一步操作。
- 如果指针j等于l2,说明字符串T的所有字符都已经与字符串S的前i个字符进行了比较,或者字符串S已经完全匹配了字符串T的前缀。在这种情况下,我们同样不需要进行任何操作。
-
如果指针i小于l1,说明字符串S中还有剩余的字符没有与字符串T的字符进行比较。这些剩余的字符都不能成为字符串T的前缀,因此我们需要将它们删除。删除操作的数量等于剩余字符的数量(l1 - i),将这些数量加到计数器count上。
-
最后,返回计数器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;
}