สมมติว่าเรามีสตริง s ที่ประกอบด้วยตัวเลข ('0' - '9') และ '#' เราต้องแมป s ไปยังตัวอักษรภาษาอังกฤษพิมพ์เล็กดังนี้:
- ตัวอักษร ('a' ถึง 'i') แทนด้วย ('1' ถึง '9') ตามลำดับ
- ตัวอักษร ('j' ถึง 'z') แทนด้วย ('10#' ถึง '26#') ตามลำดับ
เราต้องหาสตริงที่ได้หลังการแมป สมมติว่าการแมปที่ไม่ซ้ำกันจะมีอยู่เสมอ ดังนั้นถ้าอินพุตเป็น "10#11#12" ผลลัพธ์จะเป็น "jkab" เพราะ 10# คือ j, 11# คือ k, 1 คือ a และ 2 คือ b
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:
- สร้าง map หนึ่งเพื่อเก็บตัวอักษรทั้งหมดและค่า ASCII ที่สอดคล้อง
- ans := 0, และ map[''] := '', และ i := ความยาวของสตริง - 1
- while i >= 0
- ถ้า s[i] เป็น # แล้ว
- temp := ""
- for j := i - 2 ถึง i, temp := temp + s[j]
- ans := map[temp] + ans
- ลด i ลง 3
- มิฉะนั้น ans := map[s[i]] + ans, และลด i ลง 1
- ถ้า s[i] เป็น # แล้ว
- คืนค่า ans
ตัวอย่าง (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