1. 程式人生 > >Leetcode Letter Combinations of a Phone Number DFS

Leetcode Letter Combinations of a Phone Number DFS

https://leetcode.com/problems/letter-combinations-of-a-phone-number/

有一個trick 就是如果是輸入""  這個時候返回空

其他就是程式碼寫的簡潔的問題了

#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;
const int SIZE = 10+3;
class Solution {
public:
    inline string getString(int num) {
        switch (num) {
        case 0 :
            return " ";
        case 1:
            return "";
        case 2:
            return "abc";
        case 3:
            return "def";
        case 4:
            return "ghi";
        case 5:
            return "jkl";
        case 6:
            return "mno";
        case 7:
            return "pqrs";
        case 8:
            return "tuv";
        case 9:
            return "wxyz";
        }
        return "";
    }

    void dfs(string digits, int ptr, string now) {
        if(ptr >= digits.size() && now.size()==digits.size()){
            ans.push_back(now);
            return;
        }
        for(int i=ptr;i<digits.size();i++) {
            string str = getString(digits[i]-'0');
            for(int j=0;j<str.size();j++) {
                dfs( digits, i+1, now+str[j] );
            }
        }
    }
    vector<string> letterCombinations(string digits) {
        ans.clear();
        if(digits.size() == 0)return ans;   //WA了一次
        dfs(digits, 0, "");
        return ans;
    }
private:
    vector <string> ans;
};

int main() {
    Solution s;
    int n;
    string digits;
    while(cin >> digits) {
        vector<string> ans = s.letterCombinations(digits);
        for(int i=0;i<ans.size();i++) {
            cout << ans[i] << ", ";
        }
        cout << endl;
    }
    return 0;
}

一個漂亮的程式碼
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        mapping = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        vector<string> ret;
        if(digits.size() == 0)return ret;
        letterCombinationsCore(digits, "", ret);
        return ret;
    }
    void letterCombinationsCore(string digits, string sub, vector<string> &ret) {
        if (sub.size() == digits.size()) {
            ret.push_back(sub);
        } else {
            int i = digits[sub.size()] - '0';
            for (int j = 0; j < mapping[i - 2].size(); ++j) {
                sub.push_back(mapping[i - 2][j]);
                letterCombinationsCore(digits, sub, ret);
                sub.pop_back();
            }
        }
    }
    vector<string> mapping;
};