Computer >> Máy Tính >  >> Lập trình >> Python

Tìm tất cả các chuỗi được hình thành từ các ký tự được ánh xạ tới các chữ số của một số trong Python

Giả sử chúng ta có một ánh xạ ký tự như sau, ở đây mỗi chữ số, từ 1 đến 9, ánh xạ đến một vài ký tự.

1 -> ['A', 'B', 'C']
2 -> ['D', 'E', 'F']
3 -> ['G', 'H', 'I']
4 -> ['J', 'K', 'L']
5 -> ['M', 'N', 'O']
6 -> ['P', 'Q', 'R']
7 -> ['S', 'T', 'U']
8 -> ['V', 'W', 'X']
9 -> ['Y', 'Z']

Nếu chúng ta có một số, chúng ta phải thay đổi các chữ số của nó bằng các ký tự tương ứng trong danh sách ánh xạ đã cho và hiển thị tất cả các chuỗi được tạo. Chúng ta nên xem xét cùng một ký tự cho mỗi lần xuất hiện của một chữ số trong số. Số đã cho sẽ không chứa 0.

Vì vậy, nếu đầu vào là [4,3,5], thì đầu ra sẽ là

JGM KGM LGM JHM KHM LHM JIM KIM LIM JGN KGN LGN JHN KHN LHN JIN KIN LIN JGO KGO LGO JHO KHO LHO JIO KIO LIO

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • out:=một danh sách mới
  • temp:=một danh sách mới
  • char_map:=một bản đồ mới
  • chỉ mục:=0
  • đối với mỗi chữ số trong inp, hãy thực hiện
    • nếu chữ số không có trong char_map, thì
      • char_map [digit]:=index
    • xóa danh sách tạm thời
    • đối với tôi trong phạm vi từ 0 đến kích thước của bảng [chữ số - 1], hãy thực hiện
      • nếu chỉ mục giống 0, thì
        • s:=table [digit - 1, i]
        • chèn s ở cuối đoạn văn bản
      • nếu chỉ mục> 0 thì
        • đối với mỗi chuỗi ra, hãy thực hiện
          • s:=table [digit - 1, i]
            • nếu char_map [chữ số] không giống như chỉ mục, thì
              • s:=string [char_map [digit]]
            • string:=string concatenate s
            • chèn chuỗi vào cuối tạm thời
        • nếu char_map [chữ số] không giống như chỉ mục, thì
          • break
      • nếu chỉ mục> 0, thì
        • out:=một bản sao tạm thời
      • index:=index + 1
    • quay trở lại

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

def findCombinations(inp, table):
   out = list()
   temp = list()
   char_map = dict()
   index = 0
   for digit in inp:
      if digit not in char_map:
         char_map[digit] = index
      temp.clear()
      for i in range(len(table[digit - 1])):
         if index == 0:
            s = table[digit - 1][i]
            out.append(s)
         if index > 0:
            for string in out:
               s = table[digit - 1][i]
               if char_map[digit] != index:
                  s = string[char_map[digit]]
               string = string + s
               temp.append(string)
            if char_map[digit] != index:
               break
      if index > 0:
         out = temp.copy()
      index += 1
   return out
mapping = [['A', 'B', 'C'],
         ['D', 'E', 'F'],
         ['G', 'H', 'I'],
         ['J', 'K', 'L'],
         ['M', 'N', 'O'],
         ['P', 'Q', 'R'],
         ['S', 'T', 'U'],
         ['V', 'W', 'X'],
         ['Y', 'Z']]
inp = [4,3,5]
res = findCombinations(inp, mapping)
for it in res:
   print(it, end=" ")

Đầu vào

[4,3,5]

Đầu ra

JGM KGM LGM JHM KHM LHM JIM KIM LIM JGN KGN LGN JHN KHN LHN JIN KIN LIN JGO KGO LGO JHO KHO LHO JIO KIO LIO