过滤组合字符串
题目描述
每个数字关联多个字母,关联关系如下:
1. 输入一串数字后,通过数字和字母的对应关系可以得到多个字母字符串(要求按照数字的顺序组合字母字符串);
- 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”
2. 屏蔽字符串:屏蔽字符串中的所有字母不能同时在输出的字符串出现,如屏蔽字符串是abc,则要求字符串中不能同时出现a,b,c,但是允许同时出现a,b或a,c或b,c等;
3. 给定一个数字字符串和一个屏蔽字符串,输出所有可能的字符组合;
4. 例如输入数字字符串78和屏蔽字符串ux,输出结果为uw,
输入描述
- 第一行输入为一串数字字符串,数字字符串中的数字不允许重复,数字字符串的长度大于0,小于等于5;
- 第二行输入是屏蔽字符串,屏蔽字符串的长度一定小于数字字符串的长度,屏蔽字符串中字符不会重复;
输出描述
输出可能的字符串组合
注:字符串之间使用逗号隔开,最后一个字符串后携带逗号
用例
输入 | 78 ux |
输出 | uw,vw,vx, |
说明 | 无 |
输入 | 78 |
输出 | uw,vw, |
说明 | 无 |
源码和解析
解析:
- 先生成对应的map 键是数字 值是对应的字符列表
java {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]}
2. 根据输入的内容组合字符(注意这里不能简单的以为输入只会是2个数字,可能是1-5个数字,所以组合的时候得考虑使用数位DP算法)
数位DP算法不懂的,可以参考【算法】使用数位算法生成0至某个数之间的整数
例如输入的数字是0 1 2 时 组合如下
- 过滤掉屏幕字符串
- 输出剩余字符
示例代码:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class T31 {
static Map<Integer, List<Character>> map=new HashMap<Integer, List<Character>>(); //数字得到字符映射
static String group[]=null; //记录dfs算法生成的数字组合
static List<String> groupList=new ArrayList<>(); //最后生成的组合列表
static StringBuilder sb=new StringBuilder();//用于循环产生一个字符串 主要针对于group数组
public static void main(String[] args) {
String cs[]={"abc","def","ghi","jkl","mno","pqr","st","uv","wx","yz"};
String input1="789";
String input2="ux";
List<Integer> numList=new ArrayList<>();
for(int i=0;i<input1.length();i++){
numList.add(Integer.parseInt(input1.charAt(i)+""));
}
int count=0;
for(int i=0;i<cs.length;i++){
if(numList.contains(i)){
List<Character> list=new ArrayList<Character>();
for(int j=0;j<cs[i].length();j++){
list.add(cs[i].charAt(j));
}
map.put(count++, list); //map中的索引要注意替换 方便dfs算法正常生效
}
}
// System.out.println(map);
group=new String[map.size()];
dfs(0);
// System.out.println(groupList);
//过滤掉包含字符的
for(String s:groupList){
if(s.indexOf(input2)==-1){
System.out.print(s+",");
}
}
}
public static void dfs(int p){
if(p==map.size()){
for(int i=0;i<group.length;i++){
sb.append(group[i]);
}
groupList.add(sb.toString());
sb.setLength(0);
return;
}
for(int i=0;i<map.get(p).size();i++){
group[p]=map.get(p).get(i)+"";
dfs(p+1);
}
}
}
代码运行截图: