
Solution
#include<iostream>
#include<vector>
using namespace std;
int f1(string s, int i) {if (i >= s.length()) return 1;int ans;if (s[i] == '0') {ans = 0;}else {ans = f1(s, i + 1);if (i + 1 < s.length() && (s[i] - '0') * 10 + s[i + 1] - '0' <= 26) {ans += f1(s, i + 2);}}return ans;
}
int f2(string s, int i, vector<int>& dp) {if (i >= s.length()) return 1;if (dp[i] != -1) return dp[i];int ans;if (s[i] == '0') {ans = 0;}else {ans = f2(s, i + 1, dp);if (i + 1 < s.length() && (s[i] - '0') * 10 + s[i + 1] - '0' <= 26) {ans += f2(s, i + 2, dp);}}dp[i] = ans;return ans;
}
int f3(string s) {int n = s.length();vector<int>dp(n + 1, 0);dp[n] = 1;for (int i = n - 1; i >= 0; --i) {if (s[i] == '0') dp[i] = 0;else {dp[i] = dp[i + 1];if (i + 1 < n && (s[i] - '0') * 10 + s[i + 1] - '0' <= 26) {dp[i] += dp[i + 2];}}}return dp[0];
}
int f4(string s) {int n = s.length();int last=1, last_last, ans;for (int i = n - 1; i >= 0; --i) {if (s[i] == '0') ans = 0;else {ans = last;if (i + 1 < n && (s[i] - '0') * 10 + s[i + 1] - '0' <= 26) {ans += last_last;}}last_last = last;last = ans;}return ans;
}
int numDecodings1(string s) {return f1(s, 0);
}
int numDecodings2(string s) {vector<int>dp(s.length(), -1);return f2(s, 0, dp);
}
int numDecodings3(string s) {return f3(s);
}
int numDecodings4(string s) {return f4(s);
}
int main() {return 0;
}