誰能想到測試樣例還有
0
和00
這種非法輸入,哭了。
!!邊界測試的重要性,真的是測到崩潰QAQ。
思路
dp[i]:表示前i個元素能組成的解碼方法.
s[i]==0
:自己不合法,必須要和前面1或2的拼,因此倒數兩位固定。
s[i-1]=='1'||(s[i-1]=='2'&&s[i]>'0'&&s[i]<='6')
:自己這位合法,自己和前一位組合也合法,考慮兩種情況dp[i-1],dp[i-2]
的和
else
:自己合法,無法和前一位組合。
class Solution {
public:
int numDecodings(string s) {
if(s[0]=='0') return 0;
vector<int> dp(s.length()+1,0);
dp[0]=dp[1]=1;
for(int i=1;i<s.length();i++)
{
if(s[i]=='0')
{
if(s[i-1]=='1'||s[i-1]=='2')
dp[i+1]=dp[i-1];
else
return 0;
}
else{
if(s[i-1]=='1'||(s[i-1]=='2'&&s[i]>'0'&&s[i]<='6'))
{
dp[i+1]=dp[i-1]+dp[i];
}
else
{
dp[i+1]=dp[i];
}
}
}
return dp[s.length()];
}
};
由於只需要兩個數,可以降到O(1)空間
class Solution {
public:
int numDecodings(string s) {
if(s[0]=='0') return 0;
vector<int> dp(s.length()+1,0);
int pre=1;//i-2
int cur=1;//i-1
for(int i=1;i<s.length();i++)
{
int tmp=cur;//i-1
if(s[i]=='0')
{
if(s[i-1]=='1'||s[i-1]=='2')
cur=pre;//i=i-2
else
return 0;
}
else{
if(s[i-1]=='1'||(s[i-1]=='2'&&s[i]>'0'&&s[i]<='6'))
{
cur=cur+pre;//i=i-1+i-2
}
}
pre=tmp;//i-2=i-1
}
return cur;
}
};