题解 | #牛名生成器#
牛名生成器
https://www.nowcoder.com/practice/f82fe408de8f4fbdbc30162d6b3e65bb
知识点:哈希表,回溯
这道题目考查的主要是回溯算法,用到哈希表的地方在于我们需要找到数字和字母的对应关系。
首先,需要使用hashmap存储数字和字母的对应关系,然后,在根据出现的字符,依次尝试可能出现的字母,并保存下来,待所有数字遍历结束后,将该种字母排列保存下来。每次遍历结束后,需要删除当前字母,替换为下一个可能的字母。
Java题解如下:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param digits string字符串
* @return string字符串一维数组
*/
private List<String> list = new ArrayList<>();
private String digits;
private Map<Character, char[]> map = new HashMap<>();
public String[] letterCombinations (String digits) {
// write code here
if(digits.length() == 0) {
return new String[0];
}
this.digits = digits;
map.put('2', new char[]{'a', 'b', 'c'});
map.put('3', new char[]{'d', 'e', 'f'});
map.put('4', new char[]{'g', 'h', 'i'});
map.put('5', new char[]{'j', 'k', 'l'});
map.put('6', new char[]{'m', 'n', 'o'});
map.put('7', new char[]{'p', 'q', 'r', 's'});
map.put('8', new char[]{'t', 'u', 'v'});
map.put('9', new char[]{'w', 'x', 'y', 'z'});
backTracking(new StringBuilder(), 0);
String[] res = new String[list.size()];
for(int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
private void backTracking(StringBuilder sb, int index) {
if(index == digits.length()) {
list.add(sb.toString());
return;
}
for(char letter: map.get(digits.charAt(index))) {
sb.append(letter);
backTracking(sb, index + 1);
sb.deleteCharAt(sb.length() - 1);
}
}
}
