字符串变换的最小代价
题目描述
给定两个长度相同的字符串 X 和 Y(仅包含小写字母)。你可以进行以下两种操作:
- 交换相邻字符,代价为
0 - 修改某个字符为另一个字符,代价为两个字符 ASCII 码差值的绝对值
求将 X 和 Y 变换成相同字符串所需的最小总代价。
数据范围
- 1 ≤ N ≤ 2,000(N 为字符串长度)
输入描述
共三行:
- 第一行:一个整数 N,表示字符串长度
- 第二行:字符串 X
- 第三行:字符串 Y
(字符串中仅包含小写字母)
输出描述
共一行,一个整数,表示将 X 和 Y 变换成一样的字符串需要的最小的总代价。
示例
示例 1
- 输入:
4 abca abcd - 输出:
3 - 说明:其中一种代价最小的变换方案:都修改为
abcd,将第一个字符串 X 最后一个字符a修改为d,代价为|a - d| = 3
示例 2
- 输入:
4 baaa aabb - 输出:
1 - 说明:先将第一个字符串通过交换相邻字符:
baaa -> abaa -> aaba,代价为 0。然后将第二个字符串最后一个字符b修改为a:|b - a| = 1。两字符都修改为aaba,最小总代价为 1
示例 3
- 输入:
3 abc xyz - 输出:
69
答案
答案
ts
import { stdin, stdout } from "node:process";
import { createInterface } from "node:readline/promises";
const rl = createInterface({ input: stdin, output: stdout });
const n = await rl.question("请输入长度:");
const str1 = await rl.question("请输入第一个字符串:");
const str2 = await rl.question("请输入第二个字符串:");
function mySolu(n: string, str1: string, str2: string) {
let result: number = 0;
for (let i = 0; i < Number(n); i++) {
result += str1.charCodeAt(i) - str2.charCodeAt(i);
}
return result > 0 ? result : -result;
}
console.log(mySolu(n, str1, str2));
rl.close();附录
1. 获取字符的 ASCII 码
str.charCodeAt(index: number) => number
返回字符串中指定位置字符的 Unicode(ASCII)码,这里用于计算两个字符的差值。
ts
"abca".charCodeAt(3); // 97,即字符 'a' 的 ASCII 码
"abcd".charCodeAt(3); // 100,即字符 'd' 的 ASCII 码2. 取绝对值
Math.abs(num: number) => number
返回一个数的绝对值。题目要求代价非负,所以需要对差值取绝对值。
ts
Math.abs(-3); // 3
Math.abs(3); // 33. 字符串转数字
Number(value: string) => number
将字符串转换为数字,常用于把 readline 读到的输入转为数值。
ts
Number("4"); // 4