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

2781.最长合法子字符串的长度-354

时间:2023-08-01 21:34:09浏览次数:25  
标签:right word forbidden 354 ans 字符串 2781 left

最长合法子字符串的长度

给你一个字符串 word 和一个字符串数组 forbidden 。

如果一个字符串不包含 forbidden 中的任何字符串,我们称这个字符串是 合法 的。

请你返回字符串 word 的一个 最长合法子字符串 的长度。

子字符串 指的是一个字符串中一段连续的字符,它可以为空。

示例 1:

输入:word = "cbaaaabc", forbidden = ["aaa","cb"]
输出:4
解释:总共有 9 个合法子字符串:"c" ,"b" ,"a" ,"ba" ,"aa" ,"bc" ,"baa" ,"aab" 和 "aabc" 。最长合法子字符串的长度为 4 。
其他子字符串都要么包含 "aaa" ,要么包含 "cb" 。
示例 2:

输入:word = "leetcode", forbidden = ["de","le","e"]
输出:4
解释:总共有 11 个合法子字符串:"l" ,"t" ,"c" ,"o" ,"d" ,"tc" ,"co" ,"od" ,"tco" ,"cod" 和 "tcod" 。最长合法子字符串的长度为 4 。
所有其他子字符串都至少包含 "de" ,"le" 和 "e" 之一。

提示:

\(1 <= word.length <= 10^5\)
word 只包含小写英文字母。
\(1 <= forbidden.length <= 10^5\)
\(1 <= forbidden[i].length <= 10\)
forbidden[i] 只包含小写英文字母。

解题思路

见代码注释

Code

class Solution:

    #hint1 : 1 <= forbidden.length <= 1e5 && 1 <= forbidden[i].length <= 10
    #其中forbidden中字符串的数目为5次方级别的,每个字符串的长度为10
    #意味着可以想暴力的解法,枚举长度10,然后哈希去查找
    #朴素的解法:在枚举过程中回存在回溯
    #双指针
    #双指针一般有两种写法,枚举左指针为端点的最长子串(右指针不需要回溯)
    #枚举右指针为端点的最长子串(左指针不回溯)

    #可以使用第一个示例模拟双指针的过程
    #[left,right]区间内的字符串,right往回查看10个(因为最长为10)
    #找到第一个forbidden的字符串并右移左指针消掉(左指针右移就不能再左移了也就是不能回溯,要是左移必然会包含forbidden的字符串,这也是双指针的基础) 

    #看了灵神的视频讲解,大佬们的思路都好清晰啊,实际上还是要想挺多细节的,得多动脑,这样脑子转的快点

    def longestValidSubstring(self, word: str, forbidden: List[str]) -> int:
        
        #新学的知识点:set的是哈希表
        #这样查找是否存在就是O(1)的时间复杂度,不需要遍历的O(n)时间复杂度
        #但是比较键值的时间复杂度是O(M),M为10
        #转化为哈希表的时间复杂度为O(L),L为sum(forbidden[i])
        #总的时间复杂度为O(L + n * M ^2)
        fb = set(forbidden)
        left = 0
        ans = 0

        for right in range(len(word)):
            for i in range(right,max(right - 10,left - 1),-1):
                if word[i: right + 1] in fb:
                    left = i + 1
                    break
            ans = max(ans,right - left + 1)
        
        return ans 
class Solution {
public:
    //word 中不含有forbidden中任何字符串的最长子字符串
    
    int longestValidSubstring(string word, vector<string>& forbidden) {
        
        unordered_set<string> fb(forbidden.begin(),forbidden.end());
        int left = 0,ans = 0;

        for(int right = 0;right < word.size();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;      
    }
};

标签:right,word,forbidden,354,ans,字符串,2781,left
From: https://www.cnblogs.com/huangxk23/p/17599147.html

相关文章

  • MySQL字符串截取之substring_index
    substring_index(str,delim,count)str:要处理的字符串delim:分隔符count:计数 例子:str=www.wikibt.comsubstring_index(str,'.',1)结果是:wwwsubstring_index(str,'.',2)结果是:www.wikibt也就是说,如果count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容相......
  • mysql if 空字符串(如何使用mysql中的if函数处理空字符串)
    ysql中的if函数处理空字符串?ysql中,if函数可以用来实现条件判断。当我们需要处理空字符串时,可以使用if函数来判断字符串是否为空,然后根据判断结果进行相应的处理。if函数的语法如下:if(expr1,expr2,expr3)其中,expr1是条件表达式,如果该表达式的值为真,则返回expr2的值,否则返回expr3的值......
  • LeetCode 周赛上分之旅 # 36 KMP 字符串匹配殊途同归
    ⭐️本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和BaguTreePro知识星球提问。学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场LeetCode周赛的解题报告,一......
  • 从Java后端获取时间配置字符串,并在前端使用它来设置默认公布时间。
    <divclass="layui-inline"id="AItem"><labelclass="layui-form-labelsyn-form-item-require">公布时间:</label><divclass="layui-input-block">&......
  • 比较含退格的字符串
    给定s和t两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回true。#代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。示例1:输入:s="ab#c",t="ad#c"输出:true解释:s和t都会变成"ac"。示例2:输入:s="ab##",t="c#d#"输出:true解释......
  • C# 中字符串大小写的性能比较
    一般大家在C#中会使用ToLower或者ToUpper两个方法来比较字符串是否相等时忽略字符串的大小写。但其实官方有更好的写法,那就是String.Compare,现在我们一起来比较一下两种方式的性能如何以下是在.net6.0的环境中测试的结果可以很明显的看到无论是CPU还是内存,都是string.compare完胜......
  • 48. 最长不含重复字符的子字符串
    #例如对于arabcacfr,最长不含重复字符的子字符串为acfr,长度为4。deflengthOfLongestSubstring(s="arabcacfr"):defdfs(s,dp):iflen(s)==0:print(dp)returnlen(dp)ifs[:1]indp:print(dp)......
  • 46. 把数字翻译成字符串
    #例如12258一共有5种,分别是abbeh,lbeh,aveh,abyh,lyh。defnumDecodings(s="12258"):defdfs(s,dp):iflen(s)==0:print(dp)returniflen(s)>=2andint(s[:2])<=26:dpcopy=dp.copy()......
  • 《字符串篇》string类进行转换等操作
    C++中的string类用法简介原文链接:https://blog.csdn.net/liitdar/article/details/80498634概述string是C++标准库的一个重要的部分,主要用于字符串处理。c_str(),string转换为char*//方法一:使用c_str()方法,代码(stringsimple.cpp)如下:#include<string>#include<iostream......
  • 左旋字符串
    字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。解法1:用切片和“+”实现 点击查看代码classsolution{publicStringreverseLe......