最少前缀和操作问题|豆包MarsCode AI刷题

137 阅读2分钟

问题描述

小U和小R有两个字符串,分别为S和T,现在小U需要通过对S进行若干次操作,使其变成T的一个前缀。操作可以是修改S的某一个字符,或者删除S末尾的字符,现在你需要帮助小U计算出,最少需要多少次操作才可以让S变成T的前缀。

问题分析

我们需要通过对字符串 S 进行若干次操作,使其变成字符串 T 的一个前缀。操作可以是修改 S 的某一个字符,或者删除 S 末尾的字符。目标是计算出最少需要多少次操作。

解题思路

  1. 比较字符串长度:首先,比较 S 和 T 的长度。如果 S 的长度大于 T 的长度,那么 S 需要删除一些字符,直到长度与 T 相同。
  2. 逐字符比较:从字符串的开头逐字符比较 S 和 T。如果字符相同,继续比较下一个字符;如果字符不同,则需要进行修改操作。
  3. 计算操作次数:统计需要修改的字符数和需要删除的字符数。

下面是我写的代码

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++统计次数。

关键步骤解释

  1. 初始化操作次数:我们使用一个变量 ans 来记录操作次数。
  2. 比较字符串长度:如果 S 比 T 长,我们需要删除多余的字符,并增加相应的操作次数。
  3. 逐字符比较:通过循环逐字符比较 S 和 T,如果字符不同,则增加操作次数。
  4. 结果输出:最后输出变量ans就OK。

写在最后

这道题的解题过程展示了如何将繁琐的问题看透成一个简单的问题。该题偏简单,希望大家可以多思考一下想题时的思路,想明白的话,这题就并不算难。