91. Decode Ways - cocoder39/coco39_LC GitHub Wiki

91. Decode Ways

int numDecodings(string s) {
        int len = s.length();
        if (len == 0) {
            return 0;
        }
        vector<int> dp(len + 1); //dp[i] is numDecodings of s[0 ... i - 1]
        dp[0] = 1;
        
        for (int i = 1; i <= len; i++) {
            int singleDig = s[i - 1] != '0' ? dp[i - 1] : 0;
            int doubleDig = i >= 2 && (s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] >= '0' && s[i- 1] <= '6')) ? dp[i - 2] : 0;
            dp[i] = singleDig + doubleDig;
        }
        return dp[len];
    }
int numDecodings(string s) {
        int len = s.length();
        if (len == 0) {
            return 0;
        }
        
        int pre1 = 1, pre2;
        for (int i = 1; i <= len; i++) {
            int singleDig = s[i - 1] != '0' ? pre1 : 0;
            int doubleDig = i >= 2 && (s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] >= '0' && s[i- 1] <= '6')) ? pre2 : 0;
            
            pre2 = pre1;
            pre1 = singleDig + doubleDig;
        }
        return pre1;
    }

recursion: t(n) = t(n - 1) + t(n - 2) = 2^n (fibonacci)

int numDecodings(string s) {
        if (s.empty())  return 0;
        
        int res = 0;
        if (s[0] >= '1' && s[0] <= '9') {
            res += s.length() > 1 ? numDecodings(s.substr(1)) : 1;
        }
        if (s.length() > 1 && (s[0] == '1' || (s[0] == '2' && s[1] >= '0' && s[1] <= '6'))) {
            res += s.length() > 2 ? numDecodings(s.substr(2)) : 1;
        }
        return res;
    }

follow up: return all results. t(n) = t(n - 1) + t(n -2) = 2^n like fibonacci

#include <vector>

using namespace std;

void helper(vector<vector<string>>& res, vector<string>& cur, string& s, int start) {
    if (start == s.length()) {
        res.push_back(cur);
        return;
    }

    if (s[start] >= '1' && s[start] <= '9') {
        cur.push_back(string(1, s[start]));
        helper(res, cur, s, start + 1);
        cur.pop_back();
    }
    if (start + 1 < s.length() && (s[start] == '1' || (s[start] == '2' && s[start + 1] >= '0' && s[start + 1] <= '6'))) {
        cur.push_back(s.substr(start, 2));
        helper(res, cur, s, start + 2);
        cur.pop_back();
    }
}

void decode(string& s) {
    vector<vector<string>> res;
    vector<string> cur;
    helper(res, cur, s, 0);

    for (auto &strs : res) {
        for (auto &str : strs) {
            cout << str << " ";
        }
        cout << endl;
    }
}

int main() {
    string str("10223456");
    decode(str);
    return 0;
}
⚠️ **GitHub.com Fallback** ⚠️