字符串解码
原题在这里:
概述题意:给定数字字符串,要求可以转换为对应字母字符串的种数。
'A'->1,'B'->2,...'Z'->26
本来写了一个dfs暴力,果然还是TLE了
code:
class Solution { int l, ans; string x; void dfs(int i) { if (i > l || (i < l && x[i] == '0')) return; if (i >= l - 1) { ans++; return; } dfs(i + 1); if (i + 1 < l && ((x[i] - '0') * 10 + x[i + 1] - '0') < 27) dfs(i + 2); } public: int numDecodings(string s) { x = s, l = s.length(); dfs(0); return ans; } };
标准写法还得是动态规划:
定义dp[i]表示[0,i]长度的数字字符串能构成的字母字符串种数
初始化有dp[0]=1
转移方程分析:
因为'0'不能单独构成,所以
dp[i]=dp[i-1],s[i]!='0'
有二位数构成的字母,所以
dp[i]+=dp[i-2],(s[i-1]-'0')*10+s[i]-'0'<27 and s[i-1]!='0'
写完了,最后优化一下边界处理,将初始遍历下标改为1
所以最终code:
class Solution { public: int numDecodings(string s) { int l = s.length(); vector<int> dp(l + 1, 0); dp[0] = 1; for (int i = 1; i <= l; ++i) { if (s[i - 1] != '0') dp[i] += dp[i - 1]; if (i > 1 && s[i - 2] != '0' && (s[i - 2] - '0') * 10 + s[i - 1] - '0' < 27) dp[i] += dp[i - 2]; } return dp[l]; } };
【Over】

浙公网安备 33010602011771号