1309. 解码字母到整数映射
1309. 解码字母到整数映射
题目
You are given a string s
formed by digits and '#'
. We want to map s
to English lowercase characters as follows:
- Characters (
'a'
to'i'
) are represented by ('1'
to'9'
) respectively. - Characters (
'j'
to'z'
) are represented by ('10#'
to'26#'
) respectively.
Return the string formed after mapping.
The test cases are generated so that a unique mapping will always exist.
Example 1:
Input: s = "10#11#12"
Output: "jkab"
Explanation: "j" -> "10#" , "k" -> "11#" , "a" -> "1" , "b" -> "2".
Example 2:
Input: s = "1326#"
Output: "acz"
Constraints:
1 <= s.length <= 1000
s
consists of digits and the'#'
letter.s
will be a valid string such that mapping is always possible.
题目大意
给你一个字符串 s
,它由数字('0'
- '9'
)和 '#'
组成。我们希望按下述规则将 s
映射为一些小写英文字符:
- 字符(
'a'
-'i'
)分别用('1'
-'9'
)表示。 - 字符(
'j'
-'z'
)分别用('10#'
-'26#'
)表示。
返回映射之后形成的新字符串。
题目数据保证映射始终唯一。
示例 1:
输入: s = "10#11#12"
输出: "jkab"
解释: "j" -> "10#" , "k" -> "11#" , "a" -> "1" , "b" -> "2".
示例 2:
输入: s = "1326#"
输出: "acz"
提示:
1 <= s.length <= 1000
s[i]
只包含数字('0'
-'9'
)和'#'
字符。s
是映射始终存在的有效字符串。
解题思路
创建一个空字符串
res
来存储解码后的字母。使用
for
循环逐字符遍历字符串s
。检查特殊规则
- 如果当前字符的后两位是
#
,说明这是一个10#-26#
的编码。- 提取两个字符(
s[i]
和s[i+1]
)组合成数字。 - 跳过这三个字符(
i
增加 2)。
- 提取两个字符(
- 如果没有
#
,直接解码当前字符。
- 如果当前字符的后两位是
解码数字为字母
- 使用 ASCII 码转换,计算出对应字母并追加到结果字符串。
String.fromCharCode('a'.charCodeAt() + num - 1)
遍历完成后,返回解码结果字符串
res
。
复杂度分析
- 时间复杂度:
O(n)
,其中n
是字符串长度,遍历字符串s
一次。 - 空间复杂度:
O(1)
,使用了一个结果字符串res
和临时变量。
代码
/**
* @param {string} s
* @return {string}
*/
var freqAlphabets = function (s) {
let res = ''; // 初始化结果字符串
for (let i = 0; i < s.length; i++) {
let num = s[i]; // 当前字符对应的数字
if (s[i + 2] === '#') {
// 检查是否是特殊规则
num = s[i] + s[i + 1]; // 组合两位数字
i += 2; // 跳过两个字符
}
// 解码数字为字母并追加到结果
res += String.fromCharCode('a'.charCodeAt() + Number(num) - 1);
}
return res; // 返回解码后的字符串
};