91. 解码方法
动态规划,注意找状态转移方程
classSolution {
public:
int numDecodings(string s) {
int n = s.size();
vector<int> f(n + 1);
f[0] = 1; // 边界条件
for(int i = 1; i <= n; i++){
if(s[i - 1] != '0') f[i] = f[i - 1]; //单独解码s[i - 1]
if(i >= 2){
int t = (s[i - 2] - '0') * 10 + s[i - 1] - '0';
if(t >= 10 && t <= 26) f[i] += f[i - 2]; //将s[i - 2] 和 s[i - 1]组合解码
}
}
return f[n];
}
};
1309. 解码字母到整数映射
映射
#include<cstring>
class Solution {
public:
string freqAlphabets(string s) {
string ans = "";
for(int i = 0; i < s.length(); i++){
if(i+2 < s.length() && s[i+2] =='#'){
ans += 'a' + (stoi(s.substr(i,2))-1);//stoi将数字字符串转换成int输出 substr(i,2)从i开始到后面两位结束
i += 2;
}
else ans += 'a'+(s[i]-'1');
}
return ans;
}
};
205. 同构字符串
哈希表
先以s中的每个字符作为键,检查是否能够一一对应t中的每个字符,
然后再反过来以t中的字符作为键检查一遍
class Solution {
public:
bool isIsomorphic(string s, string t) {
auto helper = [] (string s, string t) {
unordered_map<char, char> mp;
for (int i = 0; i < s.length(); i ++ )
if (mp.count(s[i]) && mp[s[i]] != t[i]) return false;
else mp[s[i]] = t[i];
return true;
};
return helper(s, t) && helper(t, s);
}
};