问题描述
小U和小R有两个字符串,分别为S和T,现在小U需要通过对S进行若干次操作,使其变成T的一个前缀。操作可以是修改S的某一个字符,或者删除S末尾的字符,现在你需要帮助小U计算出,最少需要多少次操作才可以让S变成T的前缀。
问题分析
我们需要通过对字符串 S 进行若干次操作,使其变成字符串 T 的一个前缀。操作可以是修改 S 的某一个字符,或者删除 S 末尾的字符。目标是计算出最少需要多少次操作。
解题思路
- 比较字符串长度:首先,比较
S和T的长度。如果S的长度大于T的长度,那么S需要删除一些字符,直到长度与T相同。 - 逐字符比较:从字符串的开头逐字符比较
S和T。如果字符相同,继续比较下一个字符;如果字符不同,则需要进行修改操作。 - 计算操作次数:统计需要修改的字符数和需要删除的字符数。
下面是我写的代码
import java.util.ArrayList;
import java.util.List;
public class Main {
public static int solution(String x , String y) {
int len1 = x.length() , len2 = y.length();
int ans = 0;
if(len1 > len2)
{
ans += len1 - len2;
len1 = len2;
}
int i;
for(i = 0; i < len1; i++)
{
if(x.charAt(i) != y.charAt(i))
ans++;
}
return ans;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String a = scanner.nextLine();
String b = scanner.nextLine();
System.out.println(solution(a , b));
}
}
解答中的想法
首先呢就是想到当S的长度小于等于U的长度的时候,对于末尾字符来讲,删掉末尾字符抑或是修改末尾字符二者是等价的,所以只需要比较S的末尾字符与对应下标T中的字符是否相等,若相等,则不需要操作,直接next,反之,则让ans++统计次数。
关键步骤解释
- 初始化操作次数:我们使用一个变量
ans来记录操作次数。 - 比较字符串长度:如果
S比T长,我们需要删除多余的字符,并增加相应的操作次数。 - 逐字符比较:通过循环逐字符比较
S和T,如果字符不同,则增加操作次数。 - 结果输出:最后输出变量
ans就OK。
写在最后
这道题的解题过程展示了如何将繁琐的问题看透成一个简单的问题。该题偏简单,希望大家可以多思考一下想题时的思路,想明白的话,这题就并不算难。