数据结构之数组实现哈希表应用总结篇

(一)数组实现哈希表在字符串操作程序中应用

由于数组中的内存是连续的,于是可以根据下标在O(1)时间读/写任何元素,因此它的时间效率是很高的,我们可以利用数组时间效率高的优点,用数组来实现简单的哈希表,即把数组的小标设为哈希表的键值(Key),而把数组中的每一个数字设为哈希表的值(Value),这样每一个下标及数组中该下标对应的数字就组成了一个键-值的配对。

应用1:第一个只出现一次的字符

题目描述:在一个字符串中找出第一个只出现一次的字符,如输入”abaccdeff”,输出’b’.

解题思路:
用数组创建一个简单的哈希表来存储每一个字符出现的次数,再次遍历字符串,并用O(1)的时间判断该字符是否只出现了一次

#include
#include
using namespace std;

char FirstNotRepeatingChar(char *pString)
{
    if(pString == NULL)
        return NULL;
    const int hash_size=256;
    int hashTable[hash_size];
    for(int i=0;i0;
    int len=strlen(pString);
    for(int i=0;ichar ch=pString[i];
        ++hashTable[ch];
    }

    //while(*pString!='\0')//此时pString已指向尾部
    for(int i=0;ichar ch=pString[i];
        if(hashTable[ch]==1)
            return ch;
    }
    return '\0';
}

int main()
{
    char s[1000];
    cin.getline(s,1000);
    char ch=FirstNotRepeatingChar(s);
    cout<

应用2:定义一个函数,输入两个字符串,从第一个字符串中删除在第二个字符串中出现过的所有字符。例如,从第一个字符串“We are stduents”中删除在第二个字符串”aeio”中出现过的字符得到的结果时”W r stdnts”.

解题思路:
创建一个用数组实现的简单哈希表来存储第二个字符串,从头到尾扫描第一个字符串的每一个字符时,用O(1)时间判断该字符是不是在第二个字符中

#include
#include
using namespace std;

string DeleteChar(const string &s1,const string &s2)
{
    string Result;
    bool hashTable[256]={0};
    char ch;
    for(size_t i=0;iif(!hashTable[ch])
            hashTable[ch]=1;
    }
    for(size_t i=0;iif(!hashTable[ch])
            Result.push_back(ch);
    }
    return Result;
}
string DeleteChar2(const string &s1,const string &s2)
{
    string Result;
    char ch;
    for(size_t i=0;iif(s2.find_first_of(ch)==string::npos)
            Result.push_back(ch);
    }
    return Result;
}
int main()
{
    string s1,s2;
    getline(cin,s1);
    getline(cin,s2);
    cout<cout<

应用3:定义一个函数,删除字符串中所有重复出现的字符。例如输入”google”,删除重复的字符之后得到”gole”

解题思路:
创建一个用布尔型数组实现的简单哈希表,数组中的元素的意义是其下标看做ASCII码后对应的字母在字符串中是否已经出现

#include
#include
using namespace std;

void DeleteRepeatingChar(const string &s)
{
    bool hashTable[256]={false};
    char ch;
    for(string::size_type i=0;iif(!hashTable[ch])
        {
            cout<true;
        }
    }
}
int main()
{
    string str;
    getline(cin,str);
    DeleteRepeatingChar(str);
    cout<return 0;
}

应用4:变位词判断

在英语中,如果两个单词中出现的字母相同,并且每个字母出现的次数也相同,那么这两个单词互为变为词(Anagram),例如silent和listen,evil和live等为变位词

解题思路:
创建一个数组实现的简单哈希表,用来统计字符串出现的次数,当扫描到第一个字符串中的每一字符时,为哈希表对应的项的值加1,接下来扫描第二个字符串,扫描到每个字符串时,为哈希表中对应的项的值减1,如果扫描第二个字符串后,哈希表中所有的值都为0,那么这两个字符串就互为变为词

#include
#include
using namespace std;
bool Anagram(const string &s1,const string &s2)
{
    int HashTable[256]={0};
    char ch;
    for(string::size_type i=0;ifor(string::size_type i=0;ifor(int j=0;j<256;j++)
        if(HashTable[j] != 0)
            return false;
    return true;
}
int main()
{
    string s1,s2;
    cin>>s1>>s2;
    if(Anagram(s1,s2))
        cout<<"YES"<else
        cout<<"NO"<

你可能感兴趣的:(程序员面试)