哈希表的使用

哈希表一般用于存储键值对即key-val

一般是由数组和链表构成

常用操作

//查找是否存在键值
unordered_map<int,int> hash;
hash.find(key)==hash.end();//find返回的是迭代器
hash.count(key)>=1;//说明存在

例题

290. Word Pattern

由于C++中的哈希表不能查找某一值的存在,只能查找某一键是否存在,所以C++需要两个哈希表来相互存储。

class Solution {
public:
    //将字符串传入到数组中
    vector<string> split(string &s) {
	    string temp;
	    vector<string> v;
	    for (int i = 0; i < s.size(); i++) {
		    if (s[i] != ' ')temp += s[i];
		    else {
			v.push_back(temp);
			temp = "";
		    }
	    }
	    v.push_back(temp);
	    return v;
    }

    bool wordPattern(string pattern, string s) {
        //两个哈希表双向存储
        //事实上如果C++STL中如果有类似于java的containsKey函数,只需要一个哈希表就足够
        unordered_map<string,char> hash1;
        unordered_map<char,string> hash2;
        vector<string> v = split(s);

        if(v.size()!=pattern.size()) return false;  

        for(int i=0;i<pattern.size();i++){
             //如果存在并且相互对应
            if(hash1.count(v[i]) && hash2[pattern[i]] != v[i]) return false;

            if(hash2.count(pattern[i]) && hash1[v[i]] != pattern[i]) return false;
            
            //双向映射
            hash1[v[i]] = pattern[i];

            hash2[pattern[i]] = v[i];
            
        }
        return true;
    }
};

 C++中没有split函数对字符串进行划片,手写辅助函数split()。

451. 根据字符出现频率排序

这个需要根据字符数目排序,但是哈希表不能满足排序的需求

 

哈希表中存储的数据经常需要排序,一个常见的操作就是把哈希表中的数据用vector进行存放,vector可以很容易的根据一定的规则进行排序。

在定义排序规则的时候,传入的应该是vector内部的子类型数据,对于vector<pair<char,int>>,在排序的时候传入的参数是pair<char,int>类型的数据。

class Solution {
public:
    static bool cmp(pair<char,int> &a,pair<char,int> &b){
        return a.second>b.second;
    }

    
    string frequencySort(string s) {
        string res;
        unordered_map<char,int>hash;
        vector<pair<char,int>> v;
        for(auto c:s) hash[c]++;

        for(auto item:hash) v.push_back(pair(item.first,item.second));

        sort(v.begin(),v.end(),cmp);

        for(int i=0;i<v.size();i++){
            while(v[i].second--)res+=v[i].first;
        }

        return res;

    }
};

未完待续!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值