-
問題描述:
每個數字對應多個字母,對應關系如下:
0:a,b,c
1:d,e,f
2:g,h,i
3:j,k,l
4:m,n,o
5:p,q,r
6:s,t
7:u,v
8:w,x
9:y, z
輸入一串數字后,通過數字和字母的對應關系可以得到多個字母字符串(要求按照數字的順序組合字母字符串);
屏蔽字符: 屏蔽字符中的所有字母不能同時在輸出的字符串出現,如屏蔽字符時abc,則要求字符串中不能同時出現a,b,c,但是允許同時出現a,b;a,c;b,c等;
給定一個數字字符串和一個屏蔽字符串,輸出所有可能的字符組合;
例如輸入數字字符串78和屏蔽字符串ux,輸出結果為uw,vw,vx;數字字符串78,可以得到如下字符串: uw,ux,vw,vx;由于ux是屏蔽字符串,因此排除ux,最終的輸出時uw,vw,vx;
輸入描述
第一行輸入為一串數字字符串,數字字符串中的數字不允許重復,數字字符串的長度大于0,小于等于5;
第二行輸入是屏蔽字符,屏蔽字符的長度一定小于數字字符串的長度,屏蔽字符串中字符不會重復,
輸出描述
輸出可能的字符串組合
注:字符串之間使用逗號隔開,最后一個字符串后攜帶逗號
78
ux
uw,vw,vx
78
x
uw,vw
解題思路:
考慮到數字字符串長度最大為5,按照規則暴力模擬:
- 使用一個字母列表0-9索引 保存‘a’-‘z’
- 使用一個ans列表記錄屏蔽前的字符串,初始化為第一個數字對應的字母表
- 遍歷其他數字、字母表、當前ans,將字母表全部依次加入ans列表的字符串
- 遍歷ans列表,如果屏蔽字符串所有字符都能在當前字符串找到,則屏蔽該字符串(否則,將當前字符串加入新列表并輸出)
代碼實現:
alp = [('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')]
num = input()
s = input()
n = len(num)
ans = list(alp[int(num[0])])#初始化為第一個數字對應的字母表
for i in range(1,n):#后續數字temp1 = []x = alp[int(num[i])]for j in range(len(x)):#當前數字對應的字母表for k in range(len(ans)):#更新temp1temp = ans[k] + x[j]temp1.append(temp)ans = temp1#更新ans
fix_l = []
for i in range(len(ans)):for j in range(len(s)):if s[j] not in ans[i]:fix_l.append(ans[i])break
print(','.join(fix_l))