-
问题描述:
每个数字对应多个字母,对应关系如下:
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))