最少前缀操作问题
题目类型
思维题,模拟题
题意
- 小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,并记录匹配的位置。
算法步骤:
- 初始化两个指针 index 和 operations。
- 遍历字符串 S,逐个字符与 T 中的字符进行比较。
- 如果字符匹配,则移动 T 的指针。
- 如果字符不匹配,则增加操作次数。
- 遍历结束后,如果 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;
}