您的位置:首页 > 其它

【经典算法】:哈希方法

2016-01-07 17:36 260 查看

前言

作者在这里体会到了一种非常好用的方法,就是把各种变量的值存在哈希表里面,也可以把各种变量的比较用哈希表进行,深深的感受到了这种方法的遍历,然后想将其发扬光大,因此撰写此文,但是作者水平有限,可能不能完全把大家讲明白,希望大家有不懂得地方来留言问我

正文

哈希表的前奏

给出一个很简单的例子

比如说一串string : software

这个string中的每个字符都可以存进哈希表里面

哈希表就是存储字符的一张表,通过字符的ASCII码值存储

第一个例子

给出一个例子然后详细分析下让大家感受下这种方法的魅力

leetcode上面的一道题,判断两个字符串是否所有字符都能匹配

比如说 abcdef efdcab这两个字符串是能够匹配的,而abcde abcfe这两个字符串是不能匹配的。

通过哈希表做这道题的方法如下:

int count[256]; //因为有256个ASCII码值

对于第一个字符串,每出现一个字符,就把相应的ASCII码值对应的count进行++;

对于第二个字符串,每出现一个字符,就把相应的ASCII码值对应的count进行–;

对第二个字符串循环的时候进行判断,如果相应的count==0,说明在字符串里面有两个字符能够匹配

如果到最后都能匹配,说明这两个字符串完全匹配了~

附上源码:

[code]#include <iostream>
#include <string>
using namespace std;
int main(){
    int count[26];
    memset(count,0,sizeof(count));
    string s1,s2;
    cin>>s1>>s2;
    for(int i=0;i<s1.length();i++){
        count[s1[i]-'a']++;
    }
    for(i=0;i<s2.length();i++){
        count[s2[i]-'a']--;
    }
    for(i=0;i<26;i++){
        if(count[i]!=0){
            cout<<"no";
            return 0;
        }
    }
    cout<<"yes";
}


第二个例子

bulls and cows问题 ,这是一个经典问题,也不用我费劲说了

解决这个问题,也可以用上述的解题思路,能够省去很多事。

思路就在于对于相应的位进行判断,这里要写一个逻辑。

直接给上源码,认真看就能体会到这种方法的魅力~

[code]#include <iostream>
#include <string>
using namespace std;
int main(){
    int count[10];
//  bool flag[10];
    memset(count,0,sizeof(count));
    //memset(flag,false,sizeof(flag));
    string s1,s2;
    cin>>s1>>s2;
    int A=0,B=0;
    for(int i=0;i<s1.length();i++){
        if(s1[i]==s2[i]){ 
            A++;                      //A代表直接相同的位置
            //flag[s1[i]-'0']= true;
        } 
        else count[s1[i]-'0']++;
    }
    for(i=0;i<s2.length();i++){
        count[s2[i]-'0']--;
        if(count[s2[i]-'0']==0 ) {
            B++;                //B代表错位能够相同的位置
        }
    }
    cout<<A<<" "<<B<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: