1 条题解
-
0
📝 题目大意
给定一个长度为 的字符串 ,它是大写字母
A到Z的一个排列,表示键盘上 个键在一条数轴上的排列顺序。初始位置在A所在位置,需要依次按下A, B, C, \dots, Z所有键,移动到相邻键的距离为 。求完成全部输入所需的最小总移动距离。💡 解题思路
-
题目分析:键盘是一维线性排列,移动距离就是两个键在 中下标之差的绝对值。题目等价于:依次访问字符
A、B、…、Z在 中的位置,求相邻两次访问位置之差的绝对值之和。由于 长度固定为 ,数据量极小, 即可。 -
算法推导:
- 首先预处理每个字母在 中出现的位置。用数组
a[0..25]存储,其中a[0]表示'A'在 中的下标,a[1]表示'B'的下标,以此类推。具体实现:遍历 ,令a[s[i] - 'A'] = i。 - 初始位置设为
w = a[0](即'A'的位置),总距离ans = 0。 - 按字母顺序遍历
i = 0到25:每次累加当前所在位置w到目标位置a[i]的距离abs(w - a[i]),然后将w更新为a[i]。 - 注意当
i = 0时,abs(w - a[0]) = abs(a[0] - a[0]) = 0,不会增加距离,与题意"初始移动距离为 "一致。 - 最终
ans即为 ,其中 为字母表第 个字母。
- 首先预处理每个字母在 中出现的位置。用数组
-
边界与细节:
- 保证 是
A到Z的排列,不会有缺失或重复字母。 - 答案可能较大(如样例 输出 ),需使用
int(最大不超过 ,int完全足够)。 - 无需特殊处理任何边界情况。
- 保证 是
⏱️ 复杂度分析
- 时间复杂度:预处理一遍 需要 ,遍历字母表计算距离需要 ,总时间复杂度 (或写作 其中 )。
- 空间复杂度:仅需一个长度为 的数组
a和若干变量,空间复杂度 。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int a[30]; // a[i] 表示字母表中第 i 个字母(A=0, B=1, ...)在字符串 S 中的下标 int main() { ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); string s;cin>>s; // 预处理:记录每个字母在 S 中的位置 for(int i=0;i<26;i++) a[s[i]-'A']=i; // 字母 s[i] 在位置 i int w=a[0],ans=0; // w: 当前所在位置(初始为 'A' 的位置),ans: 累计移动距离 for(int i=0;i<26;i++) { ans+=abs(w-a[i]); // 从当前位置移动到目标字母 a[i] 的距离 w=a[i]; // 更新当前位置 } cout<<ans; return 0; } -
- 1
信息
- ID
- 825
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者