地址:
力扣https://leetcode-cn.com/problems/minimum-time-to-type-word-using-special-typewriter/
题目:
每一秒钟,你可以执行以下操作之一:
将指针 顺时针 或者 逆时针 移动一个字符。
键入指针 当前 指向的字符。
给你一个字符串 word ,请你返回键入 word 所表示单词的 最少 秒数 。
示例 1:
输入:word = "abc" 输出:5 解释: 单词按如下操作键入: - 花 1 秒键入字符 'a' in 1 ,因为指针初始指向 'a' ,故不需移动指针。 - 花 1 秒将指针顺时针移到 'b' 。 - 花 1 秒键入字符 'b' 。 - 花 1 秒将指针顺时针移到 'c' 。 - 花 1 秒键入字符 'c' 。 |
示例 2:
输入:word = "bza" 输出:7 解释: 单词按如下操作键入: - 花 1 秒将指针顺时针移到 'b' 。 - 花 1 秒键入字符 'b' 。 - 花 2 秒将指针逆时针移到 'z' 。 - 花 1 秒键入字符 'z' 。 - 花 1 秒将指针顺时针移到 'a' 。 - 花 1 秒键入字符 'a' 。 |
示例 3:
输入:word = "zjpc" 输出:34 解释: 单词按如下操作键入: - 花 1 秒将指针逆时针移到 'z' 。 - 花 1 秒键入字符 'z' 。 - 花 10 秒将指针顺时针移到 'j' 。 - 花 1 秒键入字符 'j' 。 - 花 6 秒将指针顺时针移到 'p' 。 - 花 1 秒键入字符 'p' 。 - 花 13 秒将指针逆时针移到 'c' 。 - 花 1 秒键入字符 'c' 。 |
提示:
1 <= word.length <= 100 word 只包含小写英文字母。 |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-time-to-type-word-using-special-typewriter
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
题目就是求字符间最小距离,再加上按键 + 1
因为存在循环,所以方向要处理两个:
1. 不跨越字母边界 abs(cur-pre)
2. 跨越字母边界 26 - abs(cur-pre)
两者取最小值
一开始在处理边界是用数组来做,复杂了,后面直接贴复杂部分的逻辑
方法一、
#define min(a,b) ( (a) < (b) ? (a) : (b) )
int minTimeToType(char * word){
int ret = 0;
int slen = strlen(word);
int i,j;
i=0;
int pre = 0;
while(word[i])
{
int cur = word[i] - 'a';
ret += min( abs(cur - pre), 26-abs(cur-pre) ) + 1;
pre = cur;
i++;
}
return ret;
}
下面是写的复杂的代码,数组idx 表示字母第一种序号,val 表示第二种序号
#define min(a,b) ( (a) < (b) ? (a) : (b) )
int minTimeToType(char * word){
int ret = 0;
int slen = strlen(word);
int map[26];
int i,j;
j=26;
for(i=0; i<26; i++)
{
map[i] = j++;
}
i=0;
int lastm1 = 0;
int lastm2 = 26;
while(word[i])
{
int m1 = word[i] - 'a';
int m2 = map[m1];
//printf("lastm1=%d, lastm2=%d, m1=%d, m2=%d\n", lastm1, lastm2, m1, m2);
if(m1 != lastm1)
{
int a = abs(lastm1 - m1);
int b = abs(lastm2 - m1);
int c = abs(lastm1 - m2);
ret += min(min(a,b), c) + 1;
}
else
ret += 1;
lastm1 = m1;
lastm2 = m2;
i++;
}
return ret;
}