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

浙公网安备 33010602011771号