一、题目描述
每个数字对应多个字母,对应关系如下:
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;
第二行输入是屏蔽字符,屏蔽字符的长度一定小于数字字符串的长度,屏蔽字符串中字符不会重复。
三、输出描述
输出可能的字符串组合。
注:字符串之间使用逗号隔开,最后一个字符串后携带逗号
四、Java算法源码
/**
* 78
* ux
*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 数字字符串
String numbers = in.nextLine();
// 屏蔽字符串
String noStr = in.nextLine();
List<String> list = new ArrayList<String>();
// 数字对应的字母组合
String[] arr = new String[numbers.length()];
for (int i = 0; i < numbers.length(); i++) {
// 单个数字
int number = Integer.valueOf(numbers.charAt(i)+"");
// 数字对应的字母组合
arr[i] = hashMap.get(number);
}
int index = 0;
LinkedList<Character> charLine = new LinkedList<>();
solution(arr, index, list, charLine, noStr);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + ",");
}
}
/**
*
* @param arr 数字对应的字母组合
* @param index 第几个字母
* @param list 不包含屏蔽字符串的字符串集合
* @param charLine 合格的字母集合
* @param noStr 屏蔽字符串
*/
public static void solution(String[] arr, int index, List<String> list, LinkedList<Character> charLine, String noStr) {
if (index == arr.length) {
StringBuilder builder = new StringBuilder();
for (Character c : charLine) {
builder.append(c);
}
// 屏蔽字符中的所有字母不能同时在输出的字符串出现
if (isContainsNoStr(builder.toString(), noStr)) {
list.add(builder.toString());
}
return;
}
for (int i = 0; i < arr[index].length(); i++) {
charLine.addLast(arr[index].charAt(i));
solution(arr, index + 1, list, charLine, noStr);
charLine.removeLast();
}
}
/**
* 是否包含屏蔽字符串
*
* 屏蔽字符中的所有字母不能同时在输出的字符串出现
*/
public static boolean isContainsNoStr(String s, String noStr) {
boolean flag = false;
// 要求按照数字的顺序组合字母字符串
for (int i = 0; i < noStr.length(); i++) {
if (!s.contains(noStr.charAt(i) + "")) {
flag = true;
break;
}
}
return flag;
}
/**
* 每个数字对应多个字母
*/
private static Map<Integer, String> hashMap = new HashMap<Integer, String>();
static {
hashMap.put(0, "abc");
hashMap.put(1, "def");
hashMap.put(2, "ghi");
hashMap.put(3, "jkl");
hashMap.put(4, "mno");
hashMap.put(5, "pqr");
hashMap.put(6, "st");
hashMap.put(7, "uv");
hashMap.put(8, "wx");
hashMap.put(9, "yz");
}
五、效果展示
1、输入
78
ux
2、输出
uw,vw,vx,
🏆下一篇:华为OD机试真题 Java 实现【服务中心选址】【2023Q1 100分 】
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。