题目 :最少前缀操作问题
问题描述
小U和小R有两个字符串,分别是S和T,现在小U需要通过对S进行若干次操作,使其变成T的一个前缀。操作可以是修改S的某一个字符,或者删除S末尾的字符。现在你需要帮助小U计算出,最少需要多少次操作才能让S变成T的前缀。
测试样例
样例1:
输入:
S = "aba", T = "abb"
输出:1
样例2:
输入:
S = "abcd", T = "efg"
输出:4
样例3:
输入:
S = "xyz", T = "xy"
输出:1
题目分析
求解题目的条件有两个 :
-
长度 :
- 如果长度不同 S.length > T.length ,先对其进行减去使得两个字符串长度相同。(直接遍历T.length的长度,对于差的长度直接加到次数中就行)
- 长度 S.length<= T.length , 对比每一个元素不同进行改(就是把次数+不同的个数就行)
-
元素是否相同。
条件变量设计
- count 记录改变的次数。对于长度较小的使用n记录需要遍历的位数。
- 对于count 的记录分为两部分 1)长度不同删除次数2)元素不同修改次数。
代码实现
public class Main {
public static int solution(String S, String T) {
// write code here
int count =0 ;
int n =0 ;
if (S.length() >=T.length()) {
count += S.length()-T.length();
n=T.length();
}else {
n= S.length();
}
for (int i = 0; i <n; i++) {
if (S.charAt(i) != T.charAt(i)) {
count ++;
}
}
System.out.println(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);
}
}
代码逻辑分析
-
初始化变量:
count:用于记录操作的总次数。n:用于记录比较的字符串长度,取S和T中较短的长度。
-
处理长度差异:
- 如果S的长度大于或等于T的长度,那么计算出S比T多出来的长度,并将这个值加到
count上,然后将n设置为T的长度。 - 如果S的长度小于T的长度,那么
n就设置为S的长度。
- 如果S的长度大于或等于T的长度,那么计算出S比T多出来的长度,并将这个值加到
-
字符比较:
- 通过一个循环,比较S和T的前
n个字符。如果字符不同,则count加1。
- 通过一个循环,比较S和T的前
-
输出和返回:
- 打印并返回
count的值。
- 打印并返回
时间复杂度分析
- 循环:代码中有一个循环,循环次数为
n,即S和T中较短字符串的长度。 - 字符比较:每次循环中,有一个字符比较操作。
- 总时间复杂度:因此,总的时间复杂度是O(n),其中n是S和T中较短字符串的长度。
空间复杂度分析
- 变量存储:代码中只使用了常数个额外变量(
count和n),没有使用额外的数据结构来存储数据。 - 总空间复杂度:因此,总的空间复杂度是O(1),即常数级别的空间复杂度。
学习计划
-
目标与时间管理:每天安排3-5道题,难度要多样化,用豆包MarsCode AI的“每日推荐”来帮助规划。
-
深度学习与记录:对错题要深入分析,用豆包MarsCode的解析功能找出弱点,并记在笔记里。
-
分步解决问题:复杂题目拆分成小任务,用AI提示逐步攻克。
对于错题:
- 定期复习:常回头看看错题,加强记忆易错点。
- 代码对比:把自己的代码和标准答案对比,找出不同之处。
总结
使用豆包MarsCode AI工具后,我的解题速度、知识整理和错题分析都有了很大提高。接下来,我打算继续利用AI功能和传统资源,加强基础并挑战更难的题目。
希望我的分享对其他初学者也有帮助,让我们一起享受学习算法的乐趣!