C++ 字符串相关算法总结

这篇博客总结了C++中字符串相关的算法,包括字典树的概念、实现与应用,Z算法的原理和模板代码,回文树的功能及模板,以及AC自动机的工作原理和优势。这些算法在字符串检索、词频统计、前缀匹配等方面有广泛应用。
摘要由CSDN通过智能技术生成

字符串相关的算法

字典树

何为字典树

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值