字符串哈希表

  1. 从第一个字符串中删除在第二个字符串中出现的所有字符

    “We are students” “aeiou” “W r studnts”

     我们可以设置两个指针pfast和pslow,初始化时两个都指向字符串中的第一个字符,pfast碰到一个需要删除的字符直接跳过;pfast如果碰到不需要删除的字符,就把该字符复制给pslow,同时pfast后移(继续需找),pslow(指向下一个位置)。这样整个算法的时间复杂度就可以达到O(n)。而如何判断该字符是否需要删除呢,对于char型字符,我们可以用长度为256的哈希表来存储字符出现的次数。
    
#include<stdio.h>
#include<string>
#include<memory>
#include <iostream>
using namespace std;
void Del_chrs(char *src, char *del_chs)
{
    if(src == NULL || del_chs==NULL)
        return;
//建立并初始化哈希表
     const int hashLength = 256;
    unsigned int hashtable[hashLength];
    for (int i = 0; i < hashLength; i++)
    {
        hashtable[i] = 0;
    }
//hash表中存储第二个字符串中每个字符出现的次数
    char *pdelch = del_chs;
    while (*pdelch != ‘\0‘)
    {
        hashtable[*pdelch] = 1;
        pdelch++;
    }

//如果Pfast指向的字符不需要删除,就把其所指的值赋给pslow,两者都向后移动
//否则,pfast向后移动继续寻找,pslow不动。
    char *p_slow = src;
    char *p_fast = src;
/*
    while (*p_fast != ‘\0‘)
    {
        if (hashtable[*p_fast] == 0)
        {
            *p_slow = *p_fast;
            p_slow++;
        }
        p_fast++;
    }
*/
     while(*p_fast)
     {
         if(hashtable[*p_fast] == 1)
         {
             p_fast++;
         }
         *p_slow++ = *p_fast++;
     }

     *p_slow = ‘\0‘;
}
int main()
{
     /*const int StrMaxLength =100;
    char strFirst [StrMaxLength];
    cin.getline(strFirst,sizeof(strFirst));

    char strSecond[StrMaxLength];
    cin.getline(strSecond,sizeof(strSecond));
    */
     char strFirst[] = "They are students";
    char strSecond[] = "aeiou";

    Del_chrs(strFirst,strSecond);
    cout << strFirst <<endl;
    return 0;
}
  1. 定义一个函数,删除字符串中所有重复出现的字符。

    “google” “gole”

#include <iostream>
#include <string.h>
using namespace std;
void stringFilterFast(const char*pInputStr)
{
    char *pOutputStr= new char[strlen(pInputStr)+1];
       char rstChar = ‘\0‘;
       bool bNotRepeatFound = false;
       const unsigned int size = 256;
       unsigned int hashTable[size];
       const char* pHashKey = pInputStr;
       int outPutCnt = 0;

       if(pInputStr== NULL)
       {
              return;
       }

       //初始化哈希表
       for(unsigned int i = 0; i < size; i++)
       {
              hashTable[i]= 0;
       }

       //将pString读入到哈希表中
       while(*pHashKey!= ‘\0‘)
       {
              cout<< *pHashKey << "\t";
              hashTable[*pHashKey]++;    //统计计数
              pHashKey++;
       }

       //读取哈希表,对只出现1次的进行存储,对出现多次的进行1次存储。
       pHashKey= pInputStr;
       while(*pHashKey!= ‘\0‘)
       {
              if((hashTable[*(pHashKey)])== 1)   //仅有一次,
              {
                     pOutputStr[outPutCnt++]= *pHashKey;
              }
              else if((hashTable[*(pHashKey)]) > 1) // 多余一次,统计第一次
              {
                     pOutputStr[outPutCnt++]= *pHashKey;
                     hashTable[*(pHashKey)]= 0;
              }
                pHashKey++;
       }
       pOutputStr[outPutCnt]= ‘\0‘;
       cout << pOutputStr ;

}

int main()
{
       const char* strSrc = "google";//"desdefedeffdssw";
      //char*strRst =new char[strlen(strSrc)+1];
       stringFilterFast(strSrc);
      // cout<< strRst << endl;
       //if (NULL != strRst){  delete[] strRst;  strRst = NULL;}
           return 0;
}

http://blog.csdn.net/laoyang360/article/details/8026579

3. 如果两个单词中出现的字母相同,并且每个字母出现的次数也相同,那么这两个单词互为变位词(Anagram)。例如:silent listen / evil live .

完成一个函数,判断输入字符串是不是为变位词。

#include <iostream>
using namespace std;

#define NO_OF_CHARS 256
bool areAnagram(const char *str1, const char *str2)
{
    if (str1 == NULL || str2 == NULL)
    {
        return false;
    }
    int count[NO_OF_CHARS] = {0};
    int i;

    for (i = 0; str1[i] && str2[i]; i++)
    {
        count[str1[i]]++;
        count[str2[i]]--;
    }
    if (str1[i] != ‘\0‘ || str2[i] != ‘\0‘)
    {
        return false;
    }

    for (i = 0; i < NO_OF_CHARS; i++)
    {
        if (count[i] != 0)
        {
            return false;
        }
    }
    return true;
}
int main(int argc, char* argv[])
{
    char str1[] = "geeksforgeeks";
    char str2[] = "forgeeksgeeks";
    if (areAnagram(str1, str2))
    {
        cout << "The two strings are anagram of each other" << endl;
    }
    else
    {
        cout << "The two strings are not anagram of each other" << endl;
    }
    return 0;
}

http://www.code123.cc/742.html

http://blog.csdn.net/lalor/article/details/7539717

时间: 2024-10-10 08:50:12

字符串哈希表的相关文章

java中哈希表及其应用详解

哈希表也称为散列表,是用来存储群体对象的集合类结构. 什么是哈希表 数组和向量都可以存储对象,但对象的存储位置是随机的,也就是说对象本身与其存储位置之间没有必然的联系.当要查找一个对象时,只能以某种顺序(如顺序查找或二分查找)与各个元素进行比较,当数组或向量中的元素数量很多时,查找的效率会明显的降低. 一种有效的存储方式,是不与其他元素进行比较,一次存取便能得到所需要的记录.这就需要在对象的存储位置和对象的关键属性(设为 k)之间建立一个特定的对应关系(设为 f),使每个对象与一个唯一的存储位置

Java知多少(79)哈希表及其应用

哈希表也称为散列表,是用来存储群体对象的集合类结构. 什么是哈希表 数组和向量都可以存储对象,但对象的存储位置是随机的,也就是说对象本身与其存储位置之间没有必然的联系.当要查找一个对象时,只能以某种顺序(如顺序查找或二分查找)与各个元素进行比较,当数组或向量中的元素数量很多时,查找的效率会明显的降低. 一种有效的存储方式,是不与其他元素进行比较,一次存取便能得到所需要的记录.这就需要在对象的存储位置和对象的关键属性(设为 k)之间建立一个特定的对应关系(设为 f),使每个对象与一个唯一的存储位置

九. 常用类库、向量与哈希6.哈希表及其应用

哈希表也称为散列表,是用来存储群体对象的集合类结构. 什么是哈希表 数组和向量都可以存储对象,但对象的存储位置是随机的,也就是说对象本身与其存储位置之间没有必然的联系.当要查找一个对象时,只能以某种顺序(如顺序查找或二分查找)与各个元素进行比较,当数组或向量中的元素数量很多时,查找的效率会明显的降低. 一种有效的存储方式,是不与其他元素进行比较,一次存取便能得到所需要的记录.这就需要在对象的存储位置和对象的关键属性(设为 k)之间建立一个特定的对应关系(设为 f),使每个对象与一个唯一的存储位置

如何建立英文字符的哈希表

经常会遇到需要建立字符串哈希表的问题,例如strtok,或者删除指定字符串的中一些字符等等,可见的字符有256个,那么很容易想到建立一个哈希表,但是其中有一些技巧,可以节省空间,其实可以使用bitmap的形式实现,但是c语言中没有现成的东西,所以需要自己实现.下面就是实现方式: char hash[32] = {0}; do { hash[*str >> 3] |= (1 << (*str & 7)); }while(*str++) 以上就建立了一个可以容纳256个字符的h

哈希表解决字符串问题

题目5:无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1. 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子

字符串哈希(自然溢出模板)

P3370 [模板]字符串哈希 题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 输入输出格式 输入格式: 第一行包含一个整数N,为字符串的个数. 接下来N行每行包含一个字符串,为所提供的字符串. 输出格式: 输出包含一行,包含一个整数,为不同的字符串个数. 输入输出样例 输入样例#1: 5 abc aaaa abc abcc 12345 输出样例#1: 4 说明 时空限制:1000ms,128M 数据

深入理解哈希表

有两个字典,分别存有 100 条数据和 10000 条数据,如果用一个不存在的 key 去查找数据,在哪个字典中速度更快? 有些计算机常识的读者都会立刻回答: “一样快,底层都用了哈希表,查找的时间复杂度为 O(1)”.然而实际情况真的是这样么? 答案是否定的,存在少部分情况两者速度不一致,本文首先对哈希表做一个简短的总结,然后思考 Java 和 Redis 中对哈希表的实现,最后再得出结论,如果对某个话题已经很熟悉,可以直接跳到文章末尾的对比和总结部分. 哈希表概述 Objective-C 中

哈希表线性探测

HashTable-散列表/哈希表,是根据关键字(key)而直接访问在内存存储位置的数据结构. 它通过一个关键值的函数将所需的数据映射到表中的位置来访问数据,这个映射函数叫做散列函数,存放记录的数组叫做散列表. 哈希冲突/哈希碰撞 不同的Key值经过哈希函数Hash(Key)处理以后可能产生相同的值哈希地址,我们称这种情况为哈希冲突.任意的散列函数都不能避免产生冲突. 我给大家介绍的是哈希表的线性探测,线性探测的基本思路: 1.用一个数据除以散列表的长度,余数是多少,就把这个数放在散列表下标相同

哈希表(散列)HashTable实现

最近刷Leetcode发现凡是找字符串中重复字符或者数组中找重复数据的时候就不知道从何下手了. 所以决定学习一下哈希表解题,哈希表的原理主要是解决分类问题,hash表是介于链表和二叉树之间的一种中间结构.链表使用十分方便,但是数据查找十分麻烦:二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果.hash表既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便. 定义hash数据结构,我采用的解决冲突的方法是分离链接法. //单链表结构 typedef struct listno