Description
Given a string s formed by digits (‘0’ - ‘9’) 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.
It’s guaranteed 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"
Example 3:
Input: s = "25#"
Output: "y"
Example 4:
Input: s = "12345678910#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#"
Output: "abcdefghijklmnopqrstuvwxyz"
Constraints:
- 1 <= s.length <= 1000
- s[i] only contains digits letters (‘0’-‘9’) and ‘#’ letter.
- s will be valid string such that mapping is always possible.
分析
题目的意思是:把数字字符串转换为单词,我的思路很直接,遍历的时候分有#号和没#号两种分别处理就行了。我看了一下其他人的实现,比较巧妙。数字总共到26,所以从后往前进行替换就行了,大的数带#号的,就被先替换,剩下的就是个位数了,所以也很快。
代码
class Solution:
def freqAlphabets(self, s: str) -> str:
n=len(s)
d={}
for i,ch in enumerate('abcdefghijklmnopqrstuvwxyz'):
d[str(i+1)]=ch
res=''
i=0
while(i<n):
if(i+2<n and s[i+2]=='#'):
res+=d[s[i:i+2]]
i+=3
else:
res+=d[s[i]]
i+=1
return res
参考文献
[LeetCode] Python 3 (two lines) (beats 100%) (16 ms) (With Explanation)