• Leetcode: Letter Combinations of a Phone Number


    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"].

    像这种DFS的题目,常见的写法无外乎两种,使用recursion, 或者用Stack。本文采用了Recursion的方式。做完后积累的经验有:像这种在一个ArrayList里面罗列可能的path的题目,recursion的参数一般包括:包含最终结果的集合(ArrayList),input(String),递归层次level(int),某一条具体的path(String)。最后这个参数虽然不是必须,但是如果使用了它,将会使recursion非常好写:所有关于这条路径的添加、删除、修改都可以以这个具体的path为操作对象,并且一旦条件满足,就可以把这个path添加到最终的结果集合里面去,用ArrayList add函数

    Recursion:

    Follow Up: 如果给你一个dictionary 如何只返回在词典出现的combination 如何做到最快,如何提高之前写的程序的runtime

    我的想法:给这个dictionary build一个Trie, time complexity O(nm), n is word count, m is average word length, 在10行recursion里面维护一个当前TrieNode, 下一跳可行的node必须是当前TrieNode的Non-null child, 可以在16行加一个If判断

     1    public class Solution {
     2         private static final String[] KEYS = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
     3     
     4         public List<String> letterCombinations(String digits) {
     5             List<String> res = new LinkedList<String>();
     6             combination("", digits, 0, res);
     7             return res;
     8         }
     9     
    10         private void combination(String prefix, String digits, int offset, List<String> res) {
    11             if (offset >= digits.length()) {
    12                 res.add(prefix);
    13                 return;
    14             }
    15             String letters = KEYS[(digits.charAt(offset) - '0')];
    16             for (int i = 0; i < letters.length(); i++) {
    17                 combination(prefix + letters.charAt(i), digits, offset + 1, ret);
    18             }
    19         }
    20     }

    Iteration: in Java

     1 public class Solution {
     2     public List<String> letterCombinations(String digits) {
     3         String[] data = new String[] { " ", "", "abc", "def", "ghi", "jkl",
     4                 "mno", "pqrs", "tuv", "wxyz" };
     5         List<String> ans = new ArrayList<String>();
     6         for (int i = 0; i < digits.length(); i++) {
     7             char[] c = data[digits.charAt(i) - '0'].toCharArray();
     8             List<String> sub = new ArrayList<String>();
     9             for (int j = 0; j < c.length; j++) {
    10                 if (ans.isEmpty())
    11                     ans.add("");
    12                 for (String s : ans) {
    13                     sub.add(s + c[j]);
    14                 }
    15                 
    16             }
    17             ans = sub;
    18         }
    19         return ans;
    20     
    21     }
    22 }
  • 相关阅读:
    ThinkPHP模版验证要注意的地方
    js关闭子页面刷新父页面
    js替换字符指定字符方法
    Ubuntu安装后的一些配置
    Docker入门
    RabbitMQ 基本概念和使用
    JAX-WS注解
    Linux 常用命令
    ubuntu16.04 搭建 Mysql服务器
    ubuntu 安装 Tomcat
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/3781123.html
Copyright © 2020-2023  润新知