给大家分享一下我最近刷的几道题的解析,还有我对ai助手的使用心得,这是第一次给大家分享的刷题解析和经验分享,这个系列预计有六期,今天给大家带来第三期的分享。
今天的题目——最少前缀操作问题
问题描述
小U和小R有两个字符串,分别是SS和TT,现在小U需要通过对SS进行若干次操作,使其变成TT的一个前缀。操作可以是修改SS的某一个字符,或者删除SS末尾的字符。现在你需要帮助小U计算出,最少需要多少次操作才能让SS变成TT的前缀。
测试样例
样例1:
输入:
S = "aba", T = "abb"
输出:1
样例2:
输入:
S = "abcd", T = "efg"
输出:4
样例3:
输入:
S = "xyz", T = "xy"
输出:1
样例4:
输入:
S = "hello", T = "helloworld"
输出:0
样例5:
输入:
S = "same", T = "same"
输出:0
解决方案
可以通过双指针的方法来解决。分别遍历字符串 S 和 T,当对应字符不同时,若 S 指针未到末尾可修改字符计一次操作,若 S 指针已到末尾则删除末尾字符计一次操作,直至 S 遍历完或成为 T 的前缀,记录操作次数即为所求最少操作数。
import java.util.List;
public class Main {
public static int solution(String S, String T) {
int s = S.length();
int t = T.length();
// 删除所需要的次数
if (s < t) {
int count = 0;
// 计算需要修改的字符数
for (int i = 0; i < s; i++) {
if (S.charAt(i) != T.charAt(i)) {
count++;
}
}
return count;
}else{
int count=s-t;
// 计算需要修改的字符数
for (int i = 0; i < t; i++) {
if (S.charAt(i) != T.charAt(i)) {
count++;
}
}
return count;
}
}
public static void main(String[] args) {
System.out.println(solution("aba", "abb") == 1);
System.out.println(solution("abcd", "efg") == 4);
System.out.println(solution("xyz", "xy") == 1);
System.out.println(solution("hello", "helloworld") == 0);
System.out.println(solution("same", "same") == 0);
}
}
一、代码整体功能概述
这段 Java 代码定义了一个名为 Main 的类,其中包含一个静态方法 solution,该方法的主要目的是计算将字符串 S 通过一定操作变成字符串 T 的一个前缀所需的最少操作次数。操作包括修改 S 中的字符或者删除 S 末尾的字符。在 main 方法中,通过调用 solution 方法并与预期结果进行比较,来验证 solution 方法的正确性。
二、代码结构及核心逻辑分析
1. solution 方法
-
参数与变量初始化:
- 方法接收两个字符串参数
S和T,首先获取它们的长度分别存储在变量s和t中。
- 方法接收两个字符串参数
-
分情况处理:
-
当
s < t时:- 初始化一个变量
count为 0,用于记录操作次数。 - 通过一个循环遍历字符串
S(因为此时S较短,只需遍历到S的长度即可),在循环中比较S和T对应位置的字符。如果字符不相同,就将count加 1,表示需要进行一次修改操作。最后返回count,这个值就是将S变成T的前缀所需的最少操作次数(此时只涉及修改操作,因为S比T短不需要删除操作)。
- 初始化一个变量
-
当
s >= t时:- 先计算出需要删除的字符数,即
s - t,并将其存储在count变量中。这是因为要让S变成T的前缀,可能需要先删除S末尾多余的字符。 - 然后通过一个循环遍历字符串
T的长度(因为此时要确保S变成和T一样长或者更短,且前面部分相同,所以只需比较到T的长度),在循环中比较S和T对应位置的字符。如果字符不相同,就将count加 1,表示需要进行一次修改操作。最后返回count,这个值就是将S变成T的前缀所需的最少操作次数(包含了可能的删除操作和后续的修改操作)。
- 先计算出需要删除的字符数,即
-
2. main 方法
- 在
main方法中,分别调用solution方法传入不同的测试用例字符串S和T,并将返回结果与预期的正确结果进行比较,通过System.out.println输出比较结果(true表示结果正确,false表示结果错误)。这样可以直观地验证solution方法在不同输入情况下是否能正确计算出所需的最少操作次数。
三、总结
这段代码实现了一个特定的字符串操作需求的计算功能,整体逻辑较为清晰,通过分情况讨论字符串长度的关系来分别处理不同情况,从而计算出将一个字符串变成另一个字符串前缀所需的最少操作次数。
四、关于使用 豆包MarsCode AI 刷题的心得
在刷题之路上邂逅豆包 MarsCode AI,犹如寻得得力伙伴。
起初面对难题,思路常如乱麻,利用它能迅速获取清晰解题步骤,像在迷宫中直接拿到地图。数学函数题,它详细拆解公式运用,从理论依据到代入求值,条理明晰,助我夯实基础,掌握多种解法拓宽思维。
英语语法填空,精准剖析句子结构、时态规则,例句辅助理解深刻。不过也深知不能过度依赖,先自我思考、尝试,再借 AI 查漏补缺,如此搭配,刷题效率飞升,知识掌握更牢固,信心亦随之增强。