力扣题解哈希表(1)

标题哈希表

标题242.有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true

示例 2: 输入: s = “rat”, t = “car” 输出: false

说明: 你可以假设字符串只包含小写字母。

总结:

1.哈希表就是一个带有字母的一一对应的表格。

2.只用一个表格,另一个覆盖减去出现的次数。

3、for循环 i < t.size(),不是《= ,报错存储不够。

时间复杂度为O(n),空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为O(1)。

字母异位不是包括。

class Solution {
public:
    bool isAnagram(string s, string t) {
        int record[26] = {0};
        for (int i = 0; i < s.size(); i++) {
            // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
            record[s[i] - 'a']++;
        }
        for (int i = 0; i < t.size(); i++) {
            record[t[i] - 'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if (record[i] != 0) {
                // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
                return false;
            }
        }
        // record数组所有元素都为零0,说明字符串s和t是字母异位词
        return true;
    }
};

标题383.赎金信

总结:

1、记录长度大的数组 —小的数组,小于0说明是假的,已经遍历完数组

// 时间复杂度: O(n)
// 空间复杂度:O(1)
  class Solution {
    public:
        bool canConstruct(string ransomNote, string magazine) {
            int record[26] = {0};
            for (int i = 0; i < magazine.length(); i++) {
                // 通过recode数据记录 magazine里各个字符出现次数
                record[magazine[i]-'a'] ++;
            }
            for (int j = 0; j < ransomNote.length(); j++) {
                // 遍历ransomNote,在record里对应的字符个数做--操作
                record[ransomNote[j]-'a']--;
                // 如果小于零说明ransomNote里出现的字符,magazine没有
                if(record[ransomNote[j]-'a'] < 0) {
                    return false;
                }
            }
            return true;
        }
    };

标题49.字母异位分组

  • 属于同一组的所有值都将映射到同一组中。
  • 需要分成不同组的值不会映射到同一组。
    总结:
    1、使用vector 容器,动态扩展,弹夹‘
    2、map 配对。第一个索引, 然后sort排序,
 class Solution {
  public:
      vector<vector<string>> groupAnagrams(vector<string>& strs) {
          vector<vector<string>> result;  
          map<string ,vector<string>> M;
      for(int i=0; i < strs.size(); i++) {
          string key = strs[i];
          sort(key.begin(),key.end());
          M[key].push_back(strs[i]);
      }
  
      for(auto it = M.begin();it != M.end(); it ++) 
          result.push_back(it->second);
          return result;
          }
       };
  class Solution {
  public:
      vector<vector<string>> groupAnagrams(vector<string>& strs) {
          /* 根据返回值定义存储结果的变量 */
          vector<vector<string>> result;
  
          unordered_map<string, vector<string>> map;
          for (string& str: strs) {
              string key = str;
              /* 将串排序后便于同一作为键 */
              sort(key.begin(), key.end());
              /* 将相同键值的字符串放入vector容器中 */
              map[key].push_back(str);//emplace_back
          }
          /* 取出相同键值的vector */
          for (auto it = map.begin(); it != map.end(); ++it)
              result.push_back(it->second);
  
          return result;
      }
  };
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RL-UAV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值