leetcode: decode ways dp 解法
leetcode: decode ways dp solution
leetcode: 解码方式
我尝试使用 dp 来优化我的递归,但是似乎效果不佳,因为 运行 时间已超过限制。任何人都可以帮我处理代码并告诉我 dp 出了什么问题吗?
class Solution {
public:
int numDecodings(string s) {
int totalnum;
*map<string, int> dp;*
stringstream ss;
int sint;
string s11=s.substr(0,2);
stringstream geek(s11);
geek>>sint;
if(dp[s]){
totalnum=dp[s];
}
else if(s[0]=='0'){
return 0;
}else if(sint>26){
string s1=s.substr(1,s.length()-1);
totalnum=numDecodings(s1);
}
else
{
if(s.length()==1){
return 1;
}
else if(s.length()==2){
string s1=s.substr(1,s.length()-1);
if(s[s.length()-1] !=0){totalnum=numDecodings(s1)+1;}
else{totalnum=numDecodings(s1);}
}
else if(s.length()>2){
string s1=s.substr(1,s.length()-1);
string s2=s.substr(2,s.length()-2);
totalnum=numDecodings(s1)+numDecodings(s2);}
}
*dp.insert(pair<string, int>(s, totalnum));*
return totalnum;
}
};
索引可以有两种状态:作为第一个数字或第二个数字。尽量避免在解决方案中创建更多字符串。
class Solution:
def numDecodings(self, s: str) -> int:
if s[0] == '0':
return 0
dp = [[0, 0] for i in range(len(s) + 1)]
dp[0][0] = 1
dp[1][0] = 1
for i in range(1, len(s)):
# zero must be second
if s[i] == '0':
if s[i-1] not in ['1', '2']:
return 0
dp[i+1] = [0, dp[i][0]]
elif '00' < s[i-1:i+1] < '27' and s[i-1] != '0':
dp[i+1] = [sum(dp[i]), sum(dp[i-1])]
else:
dp[i+1] = [sum(dp[i]), 0]
return sum(dp[len(s)])
leetcode: 解码方式
我尝试使用 dp 来优化我的递归,但是似乎效果不佳,因为 运行 时间已超过限制。任何人都可以帮我处理代码并告诉我 dp 出了什么问题吗?
class Solution {
public:
int numDecodings(string s) {
int totalnum;
*map<string, int> dp;*
stringstream ss;
int sint;
string s11=s.substr(0,2);
stringstream geek(s11);
geek>>sint;
if(dp[s]){
totalnum=dp[s];
}
else if(s[0]=='0'){
return 0;
}else if(sint>26){
string s1=s.substr(1,s.length()-1);
totalnum=numDecodings(s1);
}
else
{
if(s.length()==1){
return 1;
}
else if(s.length()==2){
string s1=s.substr(1,s.length()-1);
if(s[s.length()-1] !=0){totalnum=numDecodings(s1)+1;}
else{totalnum=numDecodings(s1);}
}
else if(s.length()>2){
string s1=s.substr(1,s.length()-1);
string s2=s.substr(2,s.length()-2);
totalnum=numDecodings(s1)+numDecodings(s2);}
}
*dp.insert(pair<string, int>(s, totalnum));*
return totalnum;
}
};
索引可以有两种状态:作为第一个数字或第二个数字。尽量避免在解决方案中创建更多字符串。
class Solution:
def numDecodings(self, s: str) -> int:
if s[0] == '0':
return 0
dp = [[0, 0] for i in range(len(s) + 1)]
dp[0][0] = 1
dp[1][0] = 1
for i in range(1, len(s)):
# zero must be second
if s[i] == '0':
if s[i-1] not in ['1', '2']:
return 0
dp[i+1] = [0, dp[i][0]]
elif '00' < s[i-1:i+1] < '27' and s[i-1] != '0':
dp[i+1] = [sum(dp[i]), sum(dp[i-1])]
else:
dp[i+1] = [sum(dp[i]), 0]
return sum(dp[len(s)])