Letter Combinations of a Phone Number - LeetCode

本文介绍了一种使用深度优先遍历算法解决电话号码字符串转换为所有可能的字母组合的方法。通过递归实现,详细展示了如何根据电话键盘上的数字映射到对应的字母。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a digit string, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below.

Input:Digit string "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.

本题使用了深度优先遍历的思想,与之前的Permutation十分相似。

遍历过程:     
 DFS 在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1;再从 w1 出发,访问与 w1邻 接但还没有访问过的顶点 w2;然后再从 w2 出发,进行类似的访问,… 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点 u 为止。
接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。

在这里,回退一步十分重要,这里是让一个点尝试其他可能。

代码以及DFS思想步骤如下:

public class Solution {
          public ArrayList<String> letterCombinations(String digits) {
        String[] ss = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        ArrayList<String> ret = new ArrayList<String>();
        rec(ret, digits.length(), ss, digits, new StringBuffer());
        return ret;
    }
     
    public void rec(ArrayList<String> ret, int remain, String[] ss, String digits, StringBuffer sb){
       
        if(remain == 0){
            ret.add(sb.toString());
            return;
        }
         
        String s = ss[digits.charAt(0)-'0'];  //the element we need to deal with      
        // DFS
        for(int i=0; i<s.length(); i++){
            sb = sb.append(s.charAt(i));//Add new element
            rec(ret, remain-1, ss, digits.substring(1), sb);//Traversal one substring
            sb.deleteCharAt(sb.length()-1);  //trace back for other solutions  
        }  
    }
}

我们可以看到DFS主要分为四个步骤:

1、分析是否遍历,如果是一种遍历可能就停止,输出

2、开始遍历,将新元素连接到结果串最后

3、遍历剩下的子串(一种可能)

4、删除最后一位的遍历尝试其他可能,直到所有可能(for循环)都被遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值