LeetCode 17.Letter Combinations of a Phone Number(电话号码的字母组合) 回溯(DFS+剪枝)/medium


1.Description

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述


2.Example

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

输入:digits = ""
输出:[]

输入:digits = "2"
输出:["a","b","c"]

3.Solution

模板题;
通过回溯来获得所有的情况。

class Test1 {
    
    
	    List<String> ans = new LinkedList<>();      // 保存结果
	    StringBuilder sb = new StringBuilder();     // 记录路径
	    int length;     // digits 的长度,即有多少个数字
	    
	    public List<String> letterCombinations(String digits) {
    
    
	        length = digits.length();
	        if (length == 0) {
    
      // 没有数字
	            return ans;
	        }
	        String[] words = reflection(digits);    // 映射
	        backtrack(words, 0);    // 回溯
	        return ans;
	    }

	    public void backtrack(String[] words, int index) {
    
    
	        // 到达结束条件
	        if (index == length) {
    
      
	            String path = sb.toString();
	            ans.add(path);
	            return;
	        }

	        // 字符串中的字符都要用一遍
	        char[] word = words[index].toCharArray();
	        int wordLength = word.length;
	        for (int i = 0; i < wordLength; i++) {
    
    
	            sb.append(word[i]);     // 选择
	            backtrack(words, index + 1);    // 深搜
	            sb.deleteCharAt(sb.length() - 1);   // 撤销
	        }
	    }

	    // 根据 digits 构造一个对应的 string[] 数组
	    public String[] reflection(String digits) {
    
    
	        char[] temp = digits.toCharArray();
	        String[] words = new String[length];
	        for (int i = 0; i < length; i++) {
    
    
	            switch (temp[i]) {
    
    
	                case '2':
	                    words[i] = "abc";
	                    break;
	                case '3':
	                    words[i] = "def";
	                    break;
	                case '4':
	                    words[i] = "ghi";
	                    break;
	                case '5':
	                    words[i] = "jkl";
	                    break;
	                case '6':
	                    words[i] = "mno";
	                    break;
	                case '7':
	                    words[i] = "pqrs";
	                    break;
	                case '8':
	                    words[i] = "tuv";
	                    break;
	                case '9':
	                    words[i] = "wxzy";
	                    break;
	                default:
	                    break;
	            }
	        }
	        return words;
	    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45736160/article/details/113530631