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

最长合法子字符串的长度

时间:2023-07-16 20:13:22浏览次数:32  
标签:node right word int 合法 字符串 最长 left

给你一个字符串 word 和一个字符串数组 forbidden 。
如果一个字符串不包含 forbidden 中的任何字符串,我们称这个字符串是 合法 的。
请你返回字符串 word 的一个 最长合法子字符串 的长度。

1. 哈希

class Solution {
public:
    int longestValidSubstring(string word, vector<string> &forbidden) {
        unordered_set<string> fb{forbidden.begin(), forbidden.end()}; //记录所有非法字符串
        int ans = 0, left = 0, n = word.length();
        for (int right = 0; right < n; right++) {//以right为右边界的字符串
            for (int i = right; i >= left && i > right - 10; i--) {//向左移动,不会越过上一个非法位置
                if (fb.count(word.substr(i, right - i + 1))) {//该部分非法
                    left = i + 1; //记录上一个合法位置
                    break; //中断查找
                }
            }
            ans = max(ans, right - left + 1);//更新当前最长合法字符串
        }
        return ans;
    }
};

2. 字典树

class Trie {
public:
    bool isEnd;
    Trie* next[26];

    Trie() {
        isEnd = false;
        memset(next, 0, sizeof(next));
    }
    void insert(string word) {
        Trie* node = this;
        for (char c : word) {
            if (node->next[c-'a'] == NULL) {
                node->next[c-'a'] = new Trie();
            }
            node = node->next[c-'a'];
        }
        node->isEnd = true;
    }
};


class Solution {
public:
    int longestValidSubstring(string word, vector<string> &forbidden) {
        Trie* tree = new Trie();
        for(auto& s:forbidden)
            tree->insert(s);

        int ans = 0, n = word.length(), right = n-1;
        for (int left = n-1 ; left >= 0; left--) {//以left为左边界的字符串
            Trie* node = tree;
            for (int i = left; i <=right && i < left + 10; i++) {//向右移动,不会越过上一个非法位置
                node = node->next[word[i]-'a'];
                if(node==NULL) break;//终止查找
                if(node->isEnd){ //存在非法字符串,对于第一个匹配的非法字符串末端
                    right = i - 1;//记录上一个合法位置
                    break;
                }
            }
            ans = max(ans, right - left + 1);//更新当前最长合法字符串
        }
        return ans;
    }
};


标签:node,right,word,int,合法,字符串,最长,left
From: https://www.cnblogs.com/929code/p/17558435.html

相关文章

  • 用字符串表达式执行引擎消除掉if else if
    背景最近我搞了个微信机器人,@机器人xxx这样来发送命令能拿到的信息有,消息内容,消息发送人,消息所在的群id等需要根据消息内容或者消息发送群id等不同的条件组合来决定走哪个处理逻辑。简单来说的话,就用很多ifelseifif(model.context.StartsWith("命令1") && model.from......
  • 用Python如何找两个字符串重复的字符
    用Python如何找两个字符串重复的字符有时候在处理字符串的时候,我们需要找出两个字符串中重复的字符。这个问题在实际开发中是非常常见的,比如在数据清洗、文本处理和密码验证等任务中。在本文中,我们将讨论如何用Python解决这个问题。方法一:遍历字符比较最简单的方法是遍历第一个......
  • 用Python如何找两个字符串中的字符
    用Python如何找两个字符串中的字符在Python中,我们可以使用多种方法来找到两个字符串中的字符。下面将介绍几种常见的方法,包括使用循环、集合操作和内置函数等。方法一:使用循环遍历字符串deffind_characters(str1,str2):common_characters=[]forcharinstr1:......
  • Java在指定位置添加字符串
    Java在指定位置添加字符串的实现作为一名经验丰富的开发者,我很乐意教会刚入行的小白如何在Java中实现在指定位置添加字符串的操作。在本篇文章中,我将按照以下步骤详细说明整个实现过程:获取原始字符串创建一个StringBuilder对象使用StringBuilder的insert()方法在指定位置插入......
  • 1-19 编写函数 reverse(s),将字符串 s 中的字符顺序颠倒过来。使用该函数 编写一个程
    ArchlinuxGCC13.1.1 202304292023-07-1521:41:44星期六 点击查看代码#include<stdio.h>#include<string.h>voidreverse(char*s);voidreverse_in();intmain(){reverse_in();return0;}voidreverse(char*s){inti,j;......
  • jquery中字符串转化int
    jQuery中字符串转化为整数的方法在JavaScript编程中,经常会遇到将字符串转化为整数的需求,例如将用户输入的字符串转化为数字进行计算。在jQuery中,可以使用一些内置的方法来实现这个操作。parseInt方法在jQuery中,可以使用parseInt方法将字符串转化为整数。parseInt方法可以解析一......
  • java—运行时常量池(Runtime Constant Pool)、常量池(Constant Pool)、字符串常量池(String
    最近在看常量池相关的东西的时候,会被这几个常量池给弄的晕乎乎的查阅了《深入理解java虚拟机》总结如下:一、常量池共有三类:’运行时常量池(RuntimeConstantPool)常量池(ConstantPool):也是常说的class文件常量池(classconstantpool)字符串常量池(StringConstantPool)二、详解......
  • 字符串比较
    Strings2=newString();//在堆中创建空白字符串。Strings1="abc";//直接赋值键盘录入得出的字符串是"new"出来的,在堆中创建//字符串比较//booleanequals方法(要比较的字符串)完全一样才是true//booleanequalslgnoreCase(要比较的字符串)忽略大小写Strings1="a......
  • 字符串算法入门笔记
    zhx:什么AC自动机,KMP算法从来不会考zhx:不推荐用string,因为麻烦读ans入一个字符串chars[MAXN];cin>>s+1;//从s[1]开始读入,操作时方便在遍历字符串时,我们要先把字符串长度存下来,因为计算字符串长度的函数strlen的时间复杂度为\(O(长度)\),如果写成for(inti=1;i<=strlen(s+......
  • python3字符串去掉汉字
    Python3字符串去掉汉字的实现作为一名经验丰富的开发者,我将向你介绍如何使用Python3来实现字符串去掉汉字的功能。在开始之前,我们先来了解一下整个实现的流程。实现流程步骤描述1导入必要的模块:我们需要使用re模块来进行正则表达式操作。2定义一个函数:我们将会创......