思路
警告:千万注意’0’这个异类,当然了还有空输入:(。
其实也是个动态规划?的问题,有点像那个走楼梯的题
当前能decode的方法数与之前的两种状态有关,就是
- 判断当前的字母s[i]能不能单个decode,如果可以,那方法数就要加上解码s[i-1]时的方法数,如果不能解那就不加;
- 判断两个字符s[i-1]s[i]的组合能不能解码(就是在不在10-26的范围内),如果可以,拿加上解码s[i-2]时的方法数;
所以事实上只要保存s[i],s[i-1]两个方法数的结果就行,我的代码空间复杂度还比较大,但是不想改了。
代码
class Solution { public: bool isLegalBiChar(char m, char n){ // is "mn" a legal word? if(m != '1' && m != '2') return false; if(m == '2'){ if(n > '6') return false; } return true; } int numDecodings(string s) { if(s.empty() || s[0]=='0') return 0; int* decodeWays = new int[s.size()]; //be care of '0's decodeWays[0] = 1; for(int i=1; i<s.size(); i++){ int ways = 0; if(s[i] > '0' && s[i] <= '9'){ ways += decodeWays[i-1]; } if(isLegalBiChar(s[i-1], s[i])){ if(i<2) ways += 1; else ways += decodeWays[i-2]; } decodeWays[i] = ways; } return decodeWays[s.size()-1]; } };