• [leetcode]Letter Combinations of a Phone Number


    DFS,用C会更合适一些,用Java就要传很多的引用。在我看来,这个DFS就是递归。

    import java.util.ArrayList;
    import java.util.HashMap;
    
    public class Solution {
        public ArrayList<String> letterCombinations(String digits) {
            // Start typing your Java solution below
            // DO NOT write main() function
            ArrayList<String> ans = new ArrayList<String>();
        	ArrayList<Character> chars = new ArrayList<Character>();
        	HashMap<Character, String> map = new HashMap<Character, String>();
        	init(map);
            dfs(map, digits, 0, chars, ans);
            if (ans.size() == 0) ans.add("");
            return ans;
        }
        
        private void dfs(HashMap<Character, String> map, String digits, int idx, ArrayList<Character> chars, ArrayList<String> arr)
        {
        	if (idx >= digits.length()) return;
        	char c = digits.charAt(idx);
        	String s = map.get(c);
        	for (int i = 0; i < s.length(); i++) {
        		
        		if (idx == digits.length() - 1) {
        			chars.add(s.charAt(i));
        			StringBuilder sb = new StringBuilder();
        			for (char cc : chars) {
        				sb.append(cc);
        			}
        			arr.add(sb.toString());
        			chars.remove(chars.size() - 1);
        		}
        		else
        		{
        			chars.add(s.charAt(i));
                    dfs(map, digits, idx+1, chars, arr);
        			chars.remove(chars.size() - 1);
        		}
        	}
        }
        
        private void init(HashMap<Character, String> map)
        {
        	map.put('1', "");
        	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");
        }
    }
    

    第二刷,这个其实类似于求全排列,适合DFS:

    class Solution {
    public:   
        vector<string> result;
        vector<string> letterCombinations(string digits) {
            string mapping[] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
            result.clear();
            string tmp;
            makeString(digits, mapping, tmp);
            return result;
        }
        
        void makeString(const string &digits, string mapping[], string &tmp)
        {
            int n = tmp.length();
            if (n == digits.length())
            {
                result.push_back(tmp);
                return;
            }
            int idx = digits[n] - '0' - 2;
            for (int i = 0; i < mapping[idx].length(); i++)
            {
                tmp.push_back(mapping[idx][i]);
                makeString(digits, mapping, tmp);
                tmp.pop_back();
            }
        }
    };
    

      

  • 相关阅读:
    C++中public、protected、private的差别
    TSP问题
    Android百日程序:绘画程序-画手指路径
    DFS csu1719 Boggle
    Oracle数据库imp
    <html>
    SWIFT学习笔记05
    Xcode7 真机免证书调试Cocos2D游戏
    mycat 不得不说的缘分
    HashMap和Hashtable的差别
  • 原文地址:https://www.cnblogs.com/lautsie/p/3223329.html
Copyright © 2020-2023  润新知