[LeetCode] 1309. Decrypt String from Alphabet to Integer Mapping 解码字母到整数映射


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.

这道题给了一个数字字符串,让解码成字母串,指定的规则是1到9分别对应a到i,j到z分别对应从 10#26#,注意后面跟的井号表示这是个两位数,不然不好区分 26 到底是z,还是b和f。那么在解码的时候,这个井号就特别重要,因为它代表着解码的方式,而且对于当前位置来说,它的位置也是固定的,所以解码的方法也就有了:判断下下一个字符是否是井号,是的话解码一个两位数,当然要首先保证不会越界,需判断 i+2 小于n,同时 s[i+2] 是井号,然后即可解析出两位数,转化为对应的字母,之后别忘了i要自增2,因为要跳过井号。否则的话就只解析当前位置的数字,转化为a到i之间的字母,参见代码如下:


class Solution {
public:
    string freqAlphabets(string s) {
        string res = "";
        int n = s.size();
        for (int i = 0; i < n; ++i) {
            if (i + 2 < n && s[i + 2] == '#') {
                res += (stoi(s.substr(i, 2)) - 1 + 'a');
                i += 2;
            } else {
                res += (s[i] - '0' - 1 + 'a');
            }
        }
        return res;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1309


参考资料:

https://leetcode.com/problems/decrypt-string-from-alphabet-to-integer-mapping/

https://leetcode.com/problems/decrypt-string-from-alphabet-to-integer-mapping/discuss/736309/C%2B%2B-0ms-solution

https://leetcode.com/problems/decrypt-string-from-alphabet-to-integer-mapping/discuss/500231/HashMap-Solution-JAVA


LeetCode All in One 题目讲解汇总(持续更新中...)

posted @ 2022-06-27 06:10  Grandyang  阅读(179)  评论(0编辑  收藏  举报
Fork me on GitHub