赎金信
class Solution {
public:bool canConstruct(string ransomNote, string magazine) {// 小写字母int r_cnt[26];int m_cnt[26];for(int i = 0; i< magazine.size(); i++) {m_cnt[magazine[i]-'a']++; // 统计}// 对比for(int i = 0; i< ransomNote.size(); i++) {if(m_cnt[ransomNote[i]-'a']) {m_cnt[ransomNote[i]-'a']--;} else {return false;}}return true;}
};
class Solution {
public:bool canConstruct(string ransomNote, string magazine) {// 小写字母int r_cnt[26];int m_cnt[26];for(int i = 0; i< magazine.size(); i++) {m_cnt[magazine[i]-'a']++; // 统计}// 对比for(int i = 0; i< ransomNote.size(); i++) {if(m_cnt[ransomNote[i]-'a']) {m_cnt[ransomNote[i]-'a']--;} else {return false;}}return true;}
};
同构字符串
class Solution {
public:bool isIsomorphic(string s, string t) {unordered_map<char,char> s_map;unordered_map<char,char> t_map;int s_size = s.size();int t_size = t.size();if(s_size != t_size) {return false;} for(int i = 0; i< s_size; i++) {char x = s[i];char y = t[i];if((s_map.count(x) && s_map[x] != y) || (t_map.count(y) && t_map[y] != x)) {return false;}s_map[x] = y;t_map[y] = x;}return true; }
};
收获
了解了一下 有关于 unordered_map 中 count 函数的使用
s_map.count(x) 就是 键为 x 的个数
逐步解析
方法二
思路
通过 match 建立关系
通过 count 记录 t[i] 是否已经有映射
这部分是表示, 不存在 s[i] 的映射, 但是发现 t[i] 已经做好映射了 ( count[t[i]] > 0 ) 直接返回 false
if (match[s[i]] == '\0') { // 如果当前字符没有映射关系if (count[t[i]] == 0) { // 如果当前字符在t中没有出现过match[s[i]] = t[i]; // 建立映射关系count[t[i]] = 1; // 将该字符在t中的出现次数加1}elsereturn false; // 如果当前字符在t中已经出现过,则返回false}
图解
class Solution {
public:bool isIsomorphic(string s, string t) {unordered_map<char, char> match; // 用于存储字符之间的映射关系unordered_map<char, int> count; // 用于记录字符在t中出现的次数for (int i = 0; i < s.size(); i++) {if (match[s[i]] == '\0') { // 如果当前字符没有映射关系if (count[t[i]] == 0) { // 如果当前字符在t中没有出现过match[s[i]] = t[i]; // 建立映射关系count[t[i]] = 1; // 将该字符在t中的出现次数加1}elsereturn false; // 如果当前字符在t中已经出现过,则返回false}else { // 如果当前字符已经有映射关系if (match[s[i]] != t[i]) { // 如果映射关系不正确return false; // 返回false}}}return true; // 所有字符都满足同构条件,返回true}
};
class Solution {
public:bool wordPattern(string pattern, string s) {unordered_map<string,char> s_patterMap;unordered_map<char, string> pattern_sMap;// 遍历int p_len = pattern.size();int left = 0;int right = 0;for(int i = 0; i< p_len ; i++) {if(left >= s.size()) {return false;}// 遍历while(right < s.size() && s[right] != ' ') right++;// 右边界 right string str = s.substr(left, right-left);if(s_patterMap.count(str) && s_patterMap[str] != pattern[i]) {return false;}if(pattern_sMap.count(pattern[i]) && pattern_sMap[pattern[i]] != str) {return false;}s_patterMap[str] = pattern[i];pattern_sMap[pattern[i]] = str;left = right + 1;right = left;}if(right < s.size()) {return false;} else {return true;}}
};
有效的字母异位词
方法一: 使用长度为 26 的数组对 小写字母进行统计
class Solution {
public:bool isAnagram(string s, string t) {// 用数组统计字母次数就可以了int s_char[26];int t_char[26];for(int i = 0; i< s.size(); i++) {s_char[s[i] - 'a']++;} for(int i = 0; i< t.size() ; i++) {t_char[t[i] - 'a'] ++;}for(int i = 0; i< 26; i++) {if(s_char[i] != t_char[i]) {return false;}}return true;}
};
方法二: 使用 unordered_map 进行统计
- 对比字符串长度
- 记录一个字符串字母组成
- 遍历另外一个字符串, 然后做减法
class Solution {
public:bool isAnagram(string s, string t) {unordered_map<char,int> s_char;// 长度对比if(s.size() != t.size()) {return false;}for(int i = 0; i< s.size(); i++) {s_char[s[i]]++;} // 遍历 t 字符串for(auto c : t){if(--s_char[c] < 0) return false;} return true;}
};
49. 字母异位分组
注意:
这里有个很好的思路, 如果是相同字母组成的单词, 对单词进行排序后, 肯定是相等, 所以通过遍历,然后对单词排序,
然后加入到 unordered_map<string, vector> 中就 , 后面就是对 unordered_map 进行遍历
要点
① 对一个单词进行排序
string str = "afdaf";
sort(str.begin(), str.end())
② 对 unordered_map<string , vector> 操作
加入
mp[key].emplace_back(strs[i]);
③ 对 unordered_map<string, vector> 遍历操作
for(auto pair: mp) {vector<string> values = pair.second;for(auto value: values) {cout<<value<<endl;}// ......
}
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 分组vector<vector<string>> result; // 结果if(strs.size() == 0 || strs.size() == 1) {result.push_back(strs);return result;}// 如果是同一组字母组成的单词, 排序后 可以画上等号unordered_map<string, vector<string>> mp; // 表示一种组合 所有单词 后面表示字符数组for(int i = 0; i< strs.size() ; i++) {string key = strs[i];sort(key.begin(), key.end());mp[key].emplace_back(strs[i]);}// 遍历 这个 mapfor(auto pair: mp) {result.emplace_back(pair.second);}return result;}
};
两数之和
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {// unordered_map<int,int> value;for(int i = 0; i< nums.size(); i++) {if(value.find(target - nums[i]) != value.end()) {auto it = value.find(target - nums[i]);return {it->second,i};}value[nums[i]] = i;}return {};}
};