目录
day10:
一. 剑指 Offer 46. 把数字翻译成字符串
题目:
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例:
输入:12258
输出:5
解释:12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
解题思路:
动态规划:
状态定义:dp[i] 是以 xi 为结尾数字的翻译方案数量
状态方程:
1. 当(10xi−1 + xi)∈[10,25]时,即xi xi-1 (如,示例中22) 整体可以翻译: dp[i] = dp[i-1] + dp[i-2]
2. 当(10xi−1 + xi)∈[0, 10) U (25, 99], 即 xi xi-1(如,示例中58) 整体可以被翻译:dp[i] = dp[i-1]
C++代码:
class Solution {
public:
int translateNum(int num) {
int a = 1, b = 1;
int x, y = num % 10;
for(int i = 2; i <= num; i++)
{
num /= 10;
x = num % 10;
int temp = 10*x + y;
int c;
if(temp >= 10 && temp <= 25)
c = a + b;
else
c = a;
b = a;
a = c;
y = x;
}
return a;
}
};
二. 剑指 Offer 48. 最长不含重复字符的子字符串
题目:
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例:
输入:"abcabcbb"
输出:3
解释:因为无重复字符的最长子串是
"abc",所以其
长度为 3。
解题思路:
哈希 + 双指针
C++代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char,int> hashTable;
int res = 0;
for(int i = 0, j = 0; i < s.size(); i++)
{
hashTable[s[i]]++;
while(j < i && hashTable[s[i]] > 1)
{
hashTable[s[j]]--;
j++;
}
res = max(res, i - j + 1);
}
return res;
}
};
题目源自: