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/
LeetCode All in One 题目讲解汇总(持续更新中…)
(欢迎加入博主的知识星球,博主将及时答疑解惑,并分享刷题经验与总结,快快加入吧~)
微信打赏
|
Venmo 打赏
—|—
转载请注明来源于 Grandyang 的博客 (grandyang.com),欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 grandyang@qq.com