问题描述
有时候我们需要检测某一字符串中是否含有某一子串,如果有,出现在哪个位置。大多数人很容易想到的是:利用双指针,一个作用于原串,一个作用于子串,逐个字符进行匹配,如果匹配到了则两个指针同时后移,如果匹配过程中出现匹配失败,则从上一次匹配的初始位置的下一位开始重新匹配,子串的指针重新回到最初的位置。这种方法虽然想法简单,但代码比较繁琐且容易出错。为了在这一问题上进行优化,便有了下面的哈希法。
基本思想
所谓哈希法,就是对子串取一个哈希值,然后对原串遍历并以子串的长度为单位将原串中每一个字符作为子串开头的情况按同样的方法取哈希值,我们只需要判断哈希值是否相同就可以了。那么,怎么取哈希值呢?我们要保证哈希值对应的字符串具有唯一性,也就是哈希值相同对应的字符串就必须相同(实际上并不是绝对的唯一性,但一般情况下该方法具有唯一性)。我们可以将一个字符串看作是表示某个n进制的数(n为某一个素数),然后用按权展开求和的方法求得哈希值。
具体代码实现:
#include<iostream>
#include<string>
using namespace std;
#define seed 7//seed表示是几进制,seed取素数
long long Hash