当前位置: 首页 > article >正文

第144场双周赛题解:两个字符串得切换距离

两个字符串得切换距离

1、题目描述

给你两个长度相同的字符串 st ,以及两个整数数组 nextCostpreviousCost

一次操作中,你可以选择 s 中的一个下标 i ,执行以下操作 之一 :

  • s[i] 切换为字母表中的下一个字母,如果 s[i] == 'z' ,切换后得到 'a' 。操作的代价为 nextCost[j] ,其中 j 表示 s[i] 在字母表中的下标。
  • s[i] 切换为字母表中的上一个字母,如果 s[i] == 'a' ,切换后得到 'z' 。操作的代价为 previousCost[j] ,其中 js[i] 在字母表中的下标。

切换距离 指的是将字符串 s 变为字符串 t 的 最少 操作代价总和。

请你返回从 st切换距离

2、解题思路

1、字符与字母表的映射
  • 字母表有 26 个字母,从 'a''z'
  • 每个字符都有对应的下标 index,计算公式为: i n d e x = o r d ( c ) − o r d ( a ) index=ord(c)−ord(a) index=ord(c)ord(a)
2、切换规则
  • 从字符 s[i] 到 ,可能需要:
    1. 顺时针切换(下一个字母)。
    2. 逆时针切换(上一个字母)。
  • 字符切换可能经过 0 到 25 个字母,因此需要考虑两种切换的代价并取较小值。
3、代价计算
  • 对于顺时针切换: c o s t = n e x t c o s t [ i n d e x ( s [ i ] ) ] + … + n e x t c o s t [ i n d e x ( t [ i ] ) ] cost=nextcost[index(s[i])]+…+nextcost[index(t[i])] cost=nextcost[index(s[i])]++nextcost[index(t[i])]
  • 对于逆时针切换: c o s t = p r e v i o u s c o s t [ i n d e x ( s [ i ] ) ] + … + p r e v i o u s c o s t [ i n d e x ( t [ i ] ) ] cost=previouscost[index(s[i])]+…+previouscost[index(t[i])] cost=previouscost[index(s[i])]++previouscost[index(t[i])]
4、贪心策略
  • 对于每对字符 ( s [ i ] , t [ i ] ) (s[i],t[i]) (s[i],t[i]),计算顺时针和逆时针切换的代价,选择较小值。

3、代码实现

class Solution {
public:
    long long shiftDistance(string s, string t, vector<int>& nextCost, vector<int>& previousCost) {
        int n = s.size();
        int alphabetSize = 26;   // 字母表大小
        long long totalCost = 0; // 使用 long long 防止溢出

        for (int i = 0; i < n; ++i) {
            int start = s[i] - 'a'; // 起始字符的下标
            int end = t[i] - 'a';   // 目标字符的下标

            // 计算顺时针代价
            long long clockwiseCost = 0;
            for (int j = start; j != end; j = (j + 1) % alphabetSize) {
                clockwiseCost += nextCost[j];
            }

            // 计算逆时针代价
            long long counterClockwiseCost = 0;
            for (int j = start; j != end; j = (j - 1 + alphabetSize) % alphabetSize) {
                counterClockwiseCost += previousCost[j];
            }

            // 累加到总代价中,选择顺时针和逆时针中的较小值
            totalCost += min(clockwiseCost, counterClockwiseCost);
        }

        return totalCost;
    }
};

关键点

  1. 代价累加使用 long long
    • totalCostclockwiseCostcounterClockwiseCost 均使用 long long 类型,防止溢出。
  2. 顺时针与逆时针的灵活计算
    • 顺时针使用 (j + 1) % alphabetSize
    • 逆时针使用 (j - 1 + alphabetSize) % alphabetSize

4、复杂度分析

  1. 时间复杂度
    • 对于每个字符对 ( s [ i ] , t [ i ] ) (s[i],t[i]) (s[i],t[i]),最多需要遍历 O(26) 次字母表。
    • 总时间复杂度为 O ( n × 26 ) = O ( n ) O(n×26)=O(n) O(n×26)=O(n)
  2. 空间复杂度
    • 仅使用常数额外空间。
    • 空间复杂度为 O(1) 。

http://www.kler.cn/a/409469.html

相关文章:

  • 12-表的约束
  • 一文学会Golang里拼接字符串的6种方式(性能对比)
  • AIGC学习笔记(6)——AI大模型开发工程师
  • 11 —— 打包模式的应用
  • 【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
  • LDR6020驱动的Type-C接口显示器解决方案
  • Dubbo Golang快速开发Rpc服务
  • 详解Oracle表的类型(二)
  • springboot集成shiro和前后端分离配置
  • matlab 反距离插值 IDW
  • 【系统架构设计师】真题论文: 论非功能性需求对企业应用架构设计的影响(包括解题思路和素材)
  • 基于YOLOv8深度学习的智慧交通事故检测系统研究与实现(PyQt5界面+数据集+训练代码)
  • jdk8特性:CompletableFuture的使用
  • 小R的随机播放顺序
  • 论文 | Recitation-Augmented Language Models
  • 6.STM32之通信接口《精讲》之USART通信(PC串口与OLED交互)---多字节数据收发(数据包的模式:HEX数据包和文本数据包)
  • 五天SpringCloud计划——DAY1之mybatis-plus的使用
  • SpringBoot3中的性能提升介绍
  • Linux上安装单机版ElasticSearch6.8.1
  • 设计模式之创建模式篇
  • 签到送金币项目
  • 集合Queue、Deque、LinkedList、ArrayDeque、PriorityQueue详解
  • FastAPI和SQLModel结合的优点
  • 拉格朗日乘子(Lagrange Multiplier)是数学分析中用于解决带有约束条件的优化问题的一种重要方法,特别是SVM
  • selenium grid 远程webdriver添加上网代理
  • 7-401 平均值