字符串相关的算法
字典树
何为字典树
在n个字符串中查找某个字符串,就像用英语字典查单词一样
先翻第一个字母,然后是第二个,然后是第三个
查找任意单词,查找次数最多只需要这个单词的字母个数
实现与功能
根节点不包含字符,除根节点以外每个子节点都只包含一个字符
从根节点到某一个节点,路径上的字符连接起来,为该节点对应的字符串
每个节点的所有子节点包含的字符互不相同
通常在结点设置一个标志来标记该节点是否为单词末尾
应用
-
字符串检索
-
词频统计
-
字符串排序
-
前缀匹配
模板
const int maxn = 2e6 + 5; //尽量开大
int tree[maxn][30]; //tree[i][j]表示节点i的第j个儿子的节点编号
bool flagg[maxn]; //表示以该节点结尾是一个单词
int tot; //总节点数
void insert_(char *str)
{
int len =s trlen(str);
int root = 0;
for(int i = 0; i < len; i++)
{
int id = str[i] - '0';
if(! tree[root][id])
tree[root][id] = ++tot;
root = tree[root][id];
}
flagg[root] = true;
}
bool find_(char *str)//查询操作,按具体要求改动
{
int len = strlen(str);
int root = 0;
for(int i = 0; i < len; i++)
{
int id = str[i] - '0';
if(! tree[root][id])
return false;
root = tree[root][id];
}
return true;
}
void init()//最后清空,节省时间
{
for(int i = 0; i <= tot; i++)
{
flagg[i] = false;
for(int j = 0; j < 10; j++)
tree[i][j] = 0;
}
tot = 0;
}
z算法
何为Z算法
输入为一个字符串s,Z算法可以求出这个字符串每一个后缀与自身的最长公共前缀(LCP),Z算法可以求出一个数组z,z[i]表示suffix(i)与字符串本身的最长公共前缀。
具体内容
设字符串s长度为n。
设前缀的左右分别为L,R(s[L,R]是s的前缀),z算法需要对这对值进行维护。i=1时,暴力比较s[0,n-1]与s[1,n-1]可得此时的L和R,同时也得到了z[1]到z[i-1]的值,现在就需要计算z[i]和新的L和R。
-
假设i&g