DFS的基本做法,每次前進一位或者兩位,搜到終點,累積加1。
class Solution {
public:
string s;
int ans = 0;
int translateNum(int num) {
s = to_string(num);
dfs(s,0);
return ans;
}
void dfs(string &s,int idx){
if(idx==s.size()){
ans++;
return;
}
dfs(s,idx+1);
if(idx+1<s.size() && check(s.substr(idx,2))){
dfs(s,idx+2);
}
}
bool check(string s){
char a = s[0];
if(a=='0'){
return false;
}
char b = s[1];
return int(a-'0')*10 + int(b-'0') <= 25;
}
};
DP做法:
類似於一百節臺階,每次跳一階後者兩階,一共有多少種跳法。
class Solution {
public:
int f[15] = {1,1};
int translateNum(int num) {
string s = to_string(num);
for(int i=2;i<=s.size();i++){
f[i] = f[i-1]+ (check(s.substr(i-2,2))?f[i-2]:0);
}
return f[s.size()];
}
bool check(string s){
char a = s[0];
if(a=='0'){
return false;
}
char b = s[1];
return int(a-'0')*10 + int(b-'0') <= 25;
}
};