跳至主要內容

1309. 解码字母到整数映射


1309. 解码字母到整数映射

🟢   🔖  字符串  🔗 力扣open in new window LeetCodeopen in new window

题目

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 是映射始终存在的有效字符串。

解题思路

  1. 创建一个空字符串 res 来存储解码后的字母。

  2. 使用 for 循环逐字符遍历字符串 s

  3. 检查特殊规则

    • 如果当前字符的后两位是 #,说明这是一个 10#-26# 的编码。
      • 提取两个字符(s[i]s[i+1])组合成数字。
      • 跳过这三个字符(i 增加 2)。
    • 如果没有 #,直接解码当前字符。
  4. 解码数字为字母

    • 使用 ASCII 码转换,计算出对应字母并追加到结果字符串。
    • String.fromCharCode('a'.charCodeAt() + num - 1)
  5. 遍历完成后,返回解码结果字符串 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; // 返回解码后的字符串
};