给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。用java怎么实现?
时间: 2023-08-31 12:19:01 浏览: 151
java中把一个数字转化为字符串
### 回答1:
可以使用递归算法来实现,首先定义一个 HashMap,将数字和字母分别映射到对应的字符串,然后使用递归函数遍历数字字符串,将当前字符的所有可能的字母组合添加到结果中,最后返回结果。代码如下:
HashMap<Character, String> map = new HashMap<Character, String>();
map.put('2', "abc");
map.put('3', "def");
map.put('4', "ghi");
map.put('5', "jkl");
map.put('6', "mno");
map.put('7', "pqrs");
map.put('8', "tuv");
map.put('9', "wxyz");
public List<String> letterCombinations(String digits) {
List<String> result = new ArrayList<>();
if (digits == null || digits.length() == 0) {
return result;
}
helper(result, new StringBuilder(), digits, 0);
return result;
}
public void helper(List<String> result, StringBuilder sb, String digits, int index) {
if (index == digits.length()) {
result.add(sb.toString());
return;
}
char c = digits.charAt(index);
String letters = map.get(c);
for (int i = 0; i < letters.length(); i++) {
sb.append(letters.charAt(i));
helper(result, sb, digits, index + 1);
sb.deleteCharAt(sb.length() - 1);
}
}
### 回答2:
题目所描述的问题可以使用回溯法来解决。具体的实现步骤如下:
1. 首先根据数字与字母的映射关系创建一个字符数组,每个数组元素存储该数字对应的字母。可以使用一个HashMap来存储这个映射关系。
2. 创建一个StringBuilder来存储当前正在生成的字母组合。
3. 从字符串的第一个数字开始,逐个数字遍历。
4. 对于当前遍历的数字,获取其对应的字母数组。
5. 遍历字母数组,将每个字母添加到StringBuilder中,并递归处理下一个数字。
6. 当遍历完所有数字时,将生成的字母组合添加到结果集合中。
7. 回溯法的核心就是递归,每次添加完一个数字后,需要将StringBuilder的最后一个字符删除,然后继续遍历下一个字母。
8. 最后返回结果集合。
下面是用Java实现以上步骤的代码:
```java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Solution {
private static final Map<Character, String> digitToLetters = new HashMap<>();
static {
digitToLetters.put('2', "abc");
digitToLetters.put('3', "def");
digitToLetters.put('4', "ghi");
digitToLetters.put('5', "jkl");
digitToLetters.put('6', "mno");
digitToLetters.put('7', "pqrs");
digitToLetters.put('8', "tuv");
digitToLetters.put('9', "wxyz");
}
public List<String> letterCombinations(String digits) {
List<String> combinations = new ArrayList<>();
if (digits == null || digits.length() == 0) {
return combinations;
}
backtrack(digits, 0, new StringBuilder(), combinations);
return combinations;
}
private void backtrack(String digits, int index, StringBuilder current, List<String> combinations) {
if (index == digits.length()) {
combinations.add(current.toString());
return;
}
char digit = digits.charAt(index);
String letters = digitToLetters.get(digit);
for (char letter : letters.toCharArray()) {
current.append(letter);
backtrack(digits, index + 1, current, combinations);
current.deleteCharAt(current.length() - 1);
}
}
public static void main(String[] args) {
Solution solution = new Solution();
List<String> combinations = solution.letterCombinations("23");
System.out.println(combinations);
}
}
```
以上代码通过回溯法实现了根据给定的数字字符串生成所有可能的字母组合,输出为["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。
### 回答3:
使用回溯算法可以解决这个问题。回溯算法通常用于解决组合问题,它通过尝试所有可能的组合,以找到所有的解集。
具体的实现步骤如下:
1. 建立数字与字母的映射关系。可以使用一个字符串数组来表示,数组下标表示数字,对应的字符串表示数字对应的字母集合。
2. 定义一个递归函数,函数的参数包括当前所拼接的字符串、选择范围的起始位置、所有可能的结果集合。
3. 在递归函数内部,先判断递归的停止条件。如果所有的数字都被处理完毕,则将当前的字符串加入结果集合中,然后返回。
4. 如果还有数字没有被处理,则需要进行递归。遍历当前数字对应的字母集合,将每个字母拼接到当前的字符串上,并将处理范围更新为下一个数字。然后进行递归调用。
5. 回溯到上一层递归时,需要将当前加入的字母移除,以便继续尝试其他的组合。
6. 在主函数中,使用一个结果集合来存储所有的结果。调用递归函数,并将结果返回。
下面是相关的Java代码实现:
```
class Solution {
private static final String[] LETTERS = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public List<String> letterCombinations(String digits) {
List<String> result = new ArrayList<String>();
if (digits == null || digits.length() == 0) {
return result;
}
backtrack("", 0, digits, result);
return result;
}
private void backtrack(String current, int start, String digits, List<String> result) {
if (start == digits.length()) {
result.add(current);
return;
}
int digit = digits.charAt(start) - '0';
String letters = LETTERS[digit];
for (int i = 0; i < letters.length(); i++) {
backtrack(current + letters.charAt(i), start + 1, digits, result);
}
}
}
```
以上是一种可以实现该功能的方法,希望对你有帮助。
阅读全文