字符串匹配之哈希法

问题描述
有时候我们需要检测某一字符串中是否含有某一子串,如果有,出现在哪个位置。大多数人很容易想到的是:利用双指针,一个作用于原串,一个作用于子串,逐个字符进行匹配,如果匹配到了则两个指针同时后移,如果匹配过程中出现匹配失败,则从上一次匹配的初始位置的下一位开始重新匹配,子串的指针重新回到最初的位置。这种方法虽然想法简单,但代码比较繁琐且容易出错。为了在这一问题上进行优化,便有了下面的哈希法。

基本思想
所谓哈希法,就是对子串取一个哈希值,然后对原串遍历并以子串的长度为单位将原串中每一个字符作为子串开头的情况按同样的方法取哈希值,我们只需要判断哈希值是否相同就可以了。那么,怎么取哈希值呢?我们要保证哈希值对应的字符串具有唯一性,也就是哈希值相同对应的字符串就必须相同(实际上并不是绝对的唯一性,但一般情况下该方法具有唯一性)。我们可以将一个字符串看作是表示某个n进制的数(n为某一个素数),然后用按权展开求和的方法求得哈希值。

具体代码实现:

#include<iostream>
#include<string>
using namespace std;

#define seed 7//seed表示是几进制,seed取素数 

long long Hash
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是用哈希实现两数之和的C语言代码: ```c #include <stdio.h> #include <stdlib.h> #define HASH_SIZE 1000 typedef struct HashNode { int key; int value; struct HashNode* next; } HashNode; typedef struct { HashNode* data[HASH_SIZE]; } HashTable; HashTable* createHashTable() { HashTable* hashTable = (HashTable*)malloc(sizeof(HashTable)); for (int i = 0; i < HASH_SIZE; i++) { hashTable->data[i] = NULL; } return hashTable; } void addNode(HashTable* hashTable, int key, int value) { int hash = abs(key) % HASH_SIZE; HashNode* node = hashTable->data[hash]; while (node != NULL) { if (node->key == key) { node->value = value; return; } node = node->next; } HashNode* newNode = (HashNode*)malloc(sizeof(HashNode)); newNode->key = key; newNode->value = value; newNode->next = hashTable->data[hash]; hashTable->data[hash] = newNode; } int getValue(HashTable* hashTable, int key) { int hash = abs(key) % HASH_SIZE; HashNode* node = hashTable->data[hash]; while (node != NULL) { if (node->key == key) { return node->value; } node = node->next; } return -1; } int* twoSum(int* nums, int numsSize, int target, int* returnSize) { HashTable* hashTable = createHashTable(); for (int i = 0; i < numsSize; i++) { int complement = target - nums[i]; int index = getValue(hashTable, complement); if (index != -1) { int* result = (int*)malloc(sizeof(int) * 2); result[0] = index; result[1] = i; *returnSize = 2; return result; } addNode(hashTable, nums[i], i); } *returnSize = 0; return NULL; } int main() { int nums[] = {2, 7, 11, 15}; int target = 9; int returnSize; int* result = twoSum(nums, sizeof(nums) / sizeof(int), target, &returnSize); for (int i = 0; i < returnSize; i++) { printf("%d ", result[i]); } free(result); return 0; } ``` 注:本代码实现了哈希表的基本操作,包括创建哈希表、添加节点、获取节点值。在实现twoSum函数时,我们利用哈希表记录每个元素在数组中的下标,然后在遍历数组的同时查找哈希表中是否存在与当前元素相加等于目标值的元素,如果存在就返回它们的下标。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值