Giả sử chuỗi s được tạo từ chữ số ('0'-'9') và '#'. Ta ánh xạ s sang chữ thường tiếng Anh như sau:
- Ký tự ('a' đến 'i') biểu diễn bằng ('1' đến '9') tương ứng.
- Ký tự ('j' đến 'z') biểu diễn bằng ('10#' đến '26#') tương ứng.
Tìm chuỗi sau khi ánh xạ. Giả định ánh xạ duy nhất luôn tồn tại. Ví dụ input "10#11#12" → "jkab" (10#=j, 11#=k, 1=a, 2=b).
Giải pháp:
- Tạo map chứa ký tự và giá trị ASCII tương ứng
- ans := "", map[''] := '', i := len(string) - 1
- while i ≥ 0
- nếu s[i] == '#', thì
- temp := ""
- for j := i-2 đến i-1, temp += s[j]
- ans := map[str(temp)] + ans
- i -= 3
- ngược lại ans := map[s[i]] + ans, i -= 1
- nếu s[i] == '#', thì
- trả về ans
Ví dụ (Python)
class Solution(object):
def freqAlphabets(self, s):
m = {}
x = 'a'
for i in range(1, 27):
m[str(i)] = x
x = chr(ord(x) + 1)
ans = ""
m[''] = ''
i = len(s) - 1
while i >= 0:
if s[i] == "#":
temp = ""
for j in range(i - 2, i):
temp += s[j]
ans = m[str(temp)] + ans
i -= 3
else:
ans = m[s[i]] + ans
i -= 1
return ans
ob1 = Solution()
print(ob1.freqAlphabets("17#123#5621#"))
Input
"17#123#5621#"
Output
qawefu