题意:A-Z分别与1-26对应,给出一串数字求有多少中匹配的可能性。
思路:DP,记录到目前位置,最多的匹配数。
class Solution {
public:
int numDecodings(string s) {
if(s.length() == 0) return 0;
map<string, bool> mm;
for(int i = 1; i <= 26; i ++) {
mm[to_string(i)] = true;
}
vector<int> re(s.length(), 0);
std::map<string, bool>::iterator it;
it = mm.find(s.substr(0, 1));
if(it == mm.end()) return 0;
re[0] = 1;
for(int i = 1; i < s.length(); ++ i) {
it = mm.find(s.substr(i, 1));
if(it != mm.end()) {
re[i] = re[i - 1];
}
it = mm.find(s.substr(i - 1, 2));
if(it != mm.end() && re[i] != 0) {
if(i == 1) re[i] = 2;
else re[i] += re[i - 2];
}
if(it != mm.end() && re[i] == 0) {
if(i == 1) re[i] = 1;
else re[i] = re[i - 2];
}
}
return re[re.size() - 1];
}
};