算法-字符串-之把数字翻译成字符串
1 #include "iostream" 2 #include "string"
3 using namespace std; 4 5 const int maxn = 90 + 5; 6 int dp[maxn]; 7 class Solution { 8 public: 9 /** 10 * 解码 11 * @param nums string字符串 数字串 12 * @return int整型 13 */ 14 15 //简单的计数dp,注意没有前导0 16 int solve(string nums) { 17 // write code here 18 memset(dp,0,sizeof(dp)); 19 dp[0] = 1; 20 int n = nums.size(); 21 for(int i = 1;i <= n;i++){ 22 if(nums[i-1] != '0') dp[i] = dp[i-1]; 23 if(i - 2 >= 0 ){ 24 if(nums[i-2] == '0') continue; 25 if(nums[i-2] == '0' && nums[i-1] == '0') return 0; 26 string temp = ""; 27 temp += nums[i-2]; 28 temp += nums[i-1]; 29 int t = stoi(temp); 30 if(t <= 26) 31 dp[i] += dp[i-2]; 32 } 33 } 34 return dp[n]; 35 } 36 }; 37 38 39 int main() 40 { 41 Solution solution; 42 string test="31717126253514741541717"; 43 int result=0; 44 result=solution.solve(test); 45 cout<<"result is: "<<result<<endl; 46 return 0; 47 }
总结:这个代码的思路是首先初始化只有1个非0的元素时,返回1.后面,再从1到n位数字逐渐判断,如果当前字符非0,则把前一位的分配种类dp[i-1]赋给当前的dp[0],即dp[i]=dp[i-1],同时还需要判断后面的一位和自身构成的整数是否在26范围内,如果是,则表示dp[i-2]+"最后的2位”也构成了一种分配方案,所以需要把它加起来,即dp[i]+=dp[i-2].后面是我写的,直接结果崩溃,而且逻辑还有些问题:
dp[0]=1有点“暧昧”。
1 class Solution { 2 public: 3 /** 4 * 解码 5 * @param nums string字符串 数字串 6 * @return int整型 7 */ 8 9 10 int GetMatchNubmer(string a,string b) 11 { 12 int count=0; 13 string temp=""; 14 for(int i=a.size()-1;i>=0;i--) 15 { 16 temp+=a.substr(i,a.size()); 17 temp+=b; 18 if(stoi(temp)>=1&&stoi(temp)<=26) 19 { 20 21 count++; 22 23 } 24 #if 1 25 if(b[0]-'0'>=1&&b[0]-'0'<=9) 26 { 27 count++; 28 } 29 #endif 30 } 31 32 return count; 33 } 34 int solve1(string nums) { 35 // write code here 36 int result=0; 37 if(nums.size()==0) 38 { 39 return 0; 40 41 } 42 if(nums.size()==1) 43 { 44 if(nums[0]-'0'>=1&&nums[0]-'0'<=9) 45 { 46 return 1; 47 } 48 else 49 { 50 return 0; 51 } 52 } 53 54 else if(nums.size()>1) 55 { 56 string temp=nums.substr(0,nums.length()-1); 57 string templast=nums.substr(nums.length()-1,nums.length()); 58 cout<<"计算:"<<temp<<"与"<<templast<<"的值"<<endl; 59 result+=solve1(temp)+GetMatchNubmer(temp,templast); 60 } 61 return result; 62 }
63 };
总结:首先,我这个思路大体分析是对的,但是解决问题的代码有待改进。应该从前往后算而不是从后往前算,导致堆栈爆掉,而且结果也不好排查。
主要为了自己学习