首页 > 代码库 > LeetCode Decode Ways
LeetCode Decode Ways
有点意思的题目。用动态规划可以O(n)求解出来:a[i]代表子字符串string(0,i)的可能解码方式,a[i] = {a[i-1] or a[i-1]+a[i-2]}.
意思是如果string(i)不为0,至少a[i] == a[i-1],即一种解码方法是string{0,.....(i-1)}+string(i);
然后如果string{i-1,i}是合法的(注意合法概念,比如11,12,20,但04就不合法),那么a[i] = a[i-1]+a[i-2],即还有一种解码方法是string{0,.....(i-2)}+string{i-1,i}
另外值得注意是如果a[i]求出来为0,那就可以停止运行了,直接返回0,因为这个字符串没法被解码。
#include<iostream> using namespace std; class Solution { public: int numDecodings(string s) { if (s == "") return 0; if (s.at(0) == '0') return 0; int len = s.size(); int* a = new int[len]; a[0] = 1; for (int i = 1; i < len; i++) { a[i] = 0; if (s.at(i) != '0') a[i] = a[i - 1]; if (s.at(i - 1) != '0') { int val = (s.at(i - 1) - '0') * 10 + (s.at(i) - '0'); if (val <= 26 && val > 0) { if (i >= 2) a[i] += a[i - 2]; else a[i] += 1; } } if (a[i] == 0) return 0; } return a[len-1]; } }; int main() { Solution sol; string s = "12004"; cout << sol.numDecodings(s) << endl; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。