首页 > 试题广场 >

小红的字符串修改

[编程题]小红的字符串修改
  • 热度指数:7546 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\,\,\,\,\,\,\,\,\,\,小红有一个由小写字母构成的字符串 s,每次她可以把其中一个任意一个字母替换成其在字母表中相邻的字母,例如把 'a' 替换成 'b' 或者 'z'。现在小红想知道,最少需要替换多少次,使得 s 成为 t子串

\,\,\,\,\,\,\,\,\,\,如果字符串 t 可以通过从字符串 s 的开头删除若干(可能为零或全部)字符以及从结尾删除若干(可能为零或全部)字符得到,则字符串 t 是字符串 s子串

输入描述:
\,\,\,\,\,\,\,\,\,\,第一行输入一个长度不超过 10^3 ,且仅由小写字母构成的字符串 s 代表小红手中待替换的串。
\,\,\,\,\,\,\,\,\,\,第二行输入一个长度不小于 s 但不超过 10^3 ,且仅由小写字母构成的字符串 t 代表目标串。


输出描述:
\,\,\,\,\,\,\,\,\,\,在一行上输出一个整数,代表最少需要替换的次数。
示例1

输入

abc
abbc

输出

1

说明

\,\,\,\,\,\,\,\,\,\,需要进行一次替换,将 '\tt c' 替换成 '\tt b' ,此时得到 "\tt abb" ,是 "\tt abbc" 的子串,因为本质上是由 "\tt abbc" 末尾删除了一个字符得到的。
示例2

输入

zzzzzz
xyzabc

输出

9
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        String t = scanner.nextLine();
        scanner.close();

        int sLen = s.length();
        int tLen = t.length();

        // 因为t的长度不小于s,所以至少有一个可能的子串
        int minOperations = Integer.MAX_VALUE;

        // 遍历t中所有与s长度相同的子串
        for (int i = 0; i <= tLen - sLen; i++) {
            int operations = 0;
            // 计算将s转换为当前子串所需的操作次数
            for (int j = 0; j < sLen; j++) {
                char sChar = s.charAt(j);
                char tChar = t.charAt(i + j);
                // 计算两个字符之间的最小替换次数
                operations += minSteps(sChar, tChar);
            }
            // 更新最小操作次数
            if (operations < minOperations) {
                minOperations = operations;
            }
        }

        System.out.println(minOperations);
    }

    // 计算两个字符之间的最小替换次数
    private static int minSteps(char a, char b) {
        int diff = Math.abs(a - b);
        // 替换可以向前或向后,取较小值
        return Math.min(diff, 26 - diff);
    }
}

发表于 2025-08-27 11:18:31 回复(0)