原題地址
https://leetcode.com/problems/decode-ways/description/
題意
將A-Z用數(shù)字表示
'A' -> 1
'B' -> 2
...
'Z' -> 26
給定一串?dāng)?shù)字組成的string袜爪,求出有幾種不同的翻譯方式憨颠。
思路
dp[i] 表示到第i個字符的位置有幾種不同的翻譯方式掷倔。
dp[i+1]時則只需要考慮 string[i+1]是否能與string[i]結(jié)合,然后分別在dp[i]的基礎(chǔ)上加上不同的值诊杆。
然而還是太naive,忘記考慮 ‘0’ 的存在了。本題‘0’只能跟在其他數(shù)字之后曹步,而不能組成‘0X’這樣的形式朝氓。
打碼的時候基于‘0’的很多情況都沒考慮到魔市,都是碰到測試樣例不過看樣例才發(fā)覺哪里錯了主届,然后修修補補,因此代碼寫得比較不忍卒讀待德。
有空的時候會重新寫一遍的君丁。
代碼
#include <iostream>
#include <string>
#include <stdlib.h> /* atoi */
using namespace std;
class Solution {
public:
int numDecodings(string s) {
if (s.size() == 0) return 0;
if (s.size() == 1) {
if (s[0] == '0') return 0;
else return 1;
}
if (s.size() == 2 ) {
if (s[0] == '0') return 0;
if(s[1]=='0'){
if ( atoi(s.c_str()) <= 26) {
return 1;
} else {
return 0;
}
}else{
if ( atoi(s.c_str()) <= 26) {
return 2;
} else {
return 1;
}
}
}
int n = s.size();
int dp[n + 1];
for (int i = 0; i < n; i++) {
if (s[0] == '0') return 0;
if (s[i] == '0' && (atoi(s.substr(i - 1, 2).c_str()) > 26 || atoi(s.substr(i - 1, 2).c_str()) == 0)) return 0;
}
dp[1] = 1;
if (s[1] == '0') {
dp[2] = 1;
cout << "a" << endl;
} else if (atoi(s.substr(0, 2).c_str()) <= 26) {
dp[2] = 2;
} else {
dp[2] = 1;
}
for (int i = 2; i < n ; i++) {
if ( s[i] == '0') {
if (atoi(s.substr(i - 1, 2).c_str()) > 20) {
// cout<<s.substr(i - 1, 2)<<endl;
return 0;
} else {
dp[i+1] = dp[i - 1];
}
} else if(s[i-1]=='0'){
dp[i+1]=dp[i-1];
} else if ( atoi(s.substr(i - 1, 2).c_str()) <= 26) {
dp[i+1] = dp[i ] +dp[i-1];
} else {
dp[i+1] = dp[i ];
}
}
for(int i =1;i<=n;i++){
cout<<dp[i]<<endl;
}
return dp[n];
}
};