算法-字符串-之把数字翻译成字符串

 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 };

 

总结:首先,我这个思路大体分析是对的,但是解决问题的代码有待改进。应该从前往后算而不是从后往前算,导致堆栈爆掉,而且结果也不好排查。

 

posted @ 2022-02-18 22:57  技术笔记记录  阅读(69)  评论(0)    收藏  举报