首页 > 其他分享 >lc2781 最长合法子字符串的长度

lc2781 最长合法子字符串的长度

时间:2024-03-23 20:11:55浏览次数:27  
标签:int 禁用 forbidden lc2781 最长 字符串 长度 ll

给定长度为n且只包含小写字母的字符串word和禁用字符串数组forbidden,如果一个字符串不包含forbidden中的任何字符串,则称其为合法。求word中最长合法子字符串的长度,子字符串可以为空。
1<=n<=1e5; 1<=forbidden.length<=1e5; 1<=forbid[i].length<=10

注意到forbid[i]长度最大只有10,因此每次往右扩展到一个字符时,可以暴力算最多10个位置,判断是否为禁用词。由于判断时是逆序的,预处理禁用词时也采用逆序。另外遇到禁用词时,比如[l,r]是禁用词,那左端点应跳到l+1处继续开始。

using ll = long long;
class Solution {
public:
    ll id(const string &s) {
        ll h = 0;
        int n = s.size();
        for (int i = n-1; i >= 0; i--) {
            h = h * 26 + (s[i]-'a'+1);
        }
        return h;
    }
    int longestValidSubstring(string word, vector<string>& forbidden) {
        set<ll> dict;
        for (auto &s : forbidden) {
            dict.insert(id(s));
        }

        auto check = [&](int L, int R) -> int {
            ll h = 0;
            for (int i = R, j=1; i >= L && j <= 10; i--, j++) {
                h = h * 26 + (word[i]-'a'+1);
                if (dict.count(h)) {
                    return j;
                }
            }
            return 0;
        };

        int n = word.size();
        int ans = 0;
        for (int i = 0, j; i < n; i = j) {
            int d = 0;
            for (j = i; j < n; j++) {
                d = check(i,j);
                if (d > 0) {
                    break;
                }
            }
            ans = max(ans, j-i);
            if (i == j) {
                j = j+1;
            } else {
                j = j-d+2;
            }
        }
        return ans;
    }
};

标签:int,禁用,forbidden,lc2781,最长,字符串,长度,ll
From: https://www.cnblogs.com/chenfy27/p/18091607

相关文章

  • C++ 最长连号
    文章目录一、题目描述最长连号题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示数据规模与约定二、参考代码一、题目描述最长连号题目描述输入长度为nn......
  • 字符串翻转(C++)
    示例:        翻转前:tobeornottobe        翻转后:otebrotonoteb基本思路:        利用strtok字符串切割函数拿到每一部分,存储到一个字符串数组中,再将每一个字符串数组倒置。最后顺序输出。程序代码:#include<iostrem>#include<string>#......
  • lc2953 统计完全子字符串的数目
    给定只包含小写字母的字符串word和整数k,如果s的某个子串中每个字符恰好出现k次,并且相邻字母最多相差2,则称其为完全字符串。求word中完全字符串的数目。1<=word.length<=1e5;1<=k<=word.length预处理出每个字母出现次数的前缀和,这样可以O(1)得到区间[l,r]内某个字母的出现次数。......
  • 代码随想录算法训练营第五十五天| ● 583. 两个字符串的删除操作 ● 72. 编辑距离
    两个字符串的删除操作 题目链接:583.两个字符串的删除操作-力扣(LeetCode)思路:第一次尝试用画图法,然后肉眼观察dp递归规律……但是dp[i][j]的含义还是参考昨天的思路,表示到此处需要删除多少个字符。classSolution{public:intminDistance(stringword1,stringword2......
  • 字符串转base64或二进制
    /***字符串转base64*@paramstr*@returns*/functionmyEncode(str){////对字符串进行编码varencode=encodeURI(str.replace(/\+/g,'躞'));//+在后台转明文会丢////对编码的字符串转化base64varbase64=btoa(encode);......
  • C语言字符函数和字符串函数及内存函数详解(干货小知识:常用函数的模拟实现)
    文章目录1.字符函数1.1字符分类函数1.2字符转换函数2.字符串函数2.1strlen函数2.1.1strlen函数的使用:2.1.2strlen函数的模拟实现2.2strcpy函数2.2.1strcpy函数的使用2.2.2strcpy函数的模拟实现2.3strcat函数2.3.1strcat函数的使用2.3.2strcat函数的模拟实......
  • 字符串与BF算法
    1.定义:BF算法,即暴力(BruteForce)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。2.BF......
  • 字符函数与字符串函数
    目录1.字符分类函数1.1isupper函数1.2islower函数2. 字符转换函数3.strlen的使⽤和模拟实现4.strcpy的使⽤和模拟实现5.strcat的使⽤和模拟实现6. strcmp的使⽤和模拟实现7.strncpy函数的使⽤8.strncat函数的使⽤9.strncmp函数的使⽤10.strstr的使⽤和模拟......
  • P1420 最长连号
    P1420最长连号最长连号题目描述输入长度为\(n\)的一个正整数序列,要求输出序列中最长连号的长度。连号指在序列中,从小到大的连续自然数。输入格式第一行,一个整数\(n\)。第二行,\(n\)个整数\(a_i\),之间用空格隔开。输出格式一个数,最长连号的个数。样例#1样例输入......
  • 获取字符串长度LEN
    selectLEN('asd')--结果:{3}去除空格LTRIM、RTRIM、TRIMselectLTRIM('  444 5 ')--去除字符串左边的空格,结果:{444 5}selectRTRIM('  444 5 ')--去除字符串右边的空格,结果:{  444 5}selectTRIM('  444 5 ')--去除字符串两边的空格,结果:{444 5}......