day10

1.剑指 Offer 46. 把数字翻译成字符串

 动态方程:

dp[i] = dp[i + 1] + dp[i + 2]



dp[i] = dp[i + 1]
 1 class Solution {
 2 public:
 3     int translateNum(int num) {
 4       if(num >= 0 && num <= 9) return 1;
 5       int nums[31];
 6       int n = 0;
 7       while(num > 0){
 8           nums[n ++] = num % 10;
 9           num /= 10;
10       }
11       int dp[n];
12       dp[n - 1] = 1;
13       if(nums[n - 1] == 1 || (nums[n - 1] == 2 && nums[n - 2] < 6))
14         dp[n - 2] = 2;
15       else
16         dp[n - 2] = 1;
17       for(int i = n - 3;i >= 0;i --){
18           if(nums[i + 1] == 1 || (nums[i + 1] == 2 && nums[i] < 6))
19            dp[i] = dp[i + 1] + dp[i + 2];
20           else
21            dp[i] = dp[i + 1];
22       }
23       return dp[0];
24     }
25 };

2.剑指 Offer 48. 最长不含重复字符的子字符串

 dp[j] 代表以字符 s[j]为结尾的 “最长不重复子字符串” 的长度

 res是在dp[0]--dp[j]里找到最大值

 1 class Solution {
 2 public:
 3     int dp[40001];
 4     int lengthOfLongestSubstring(string s) {
 5       unordered_map<char,int> dic;
 6       int n = s.size();
 7       if(n == 0) return 0;
 8       dp[0] = 1;dic[s[0]] = 0;
 9       int res = 1;
10       for(int j = 1;j < n;j ++){
11           int i;
12           if(dic.find(s[j]) == dic.end())   i = - 1;
13           else   i = dic[s[j]];
14           dic[s[j]] = j;
15           if(j - i > dp[j - 1]) 
16             dp[j] = dp[j - 1] + 1;
17           else
18             dp[j] = j - i;
19           res = max(res,dp[j]);
20       }
21       return res;
22     }
23 };

 

posted @ 2022-07-07 17:21  balabalahhh  阅读(24)  评论(0)    收藏  举报