首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

最长重复子

题目: 思路: 首先明确了这个可以在一次循环中解决即时间复杂度为O(n) 其次,在循环中,我们应能知道起始位置,然后终止于哪个位置,当碰到终止时候必然是元素为已经纳入我们统计中元素。...所以我们是否能用一个容器将元素不断纳入,在纳入过程中判断这个元素是否已经被纳入了进来,最好是有序方便我们吧从某处元素之前那些一次性全部丢弃。...        System.out.println(maxLength1(num));     }     /**      * 方案二      * 原理:      * 当某个数在之前出现过,这个时候就把子起点...到第二个3时,以后子串起点start为4,      * 到第二个1时,如果不取最大start,按start = map.get(arr[end])+1      * 算出起点start为2,显然以起点...start=2,结尾end=1234351有重复,      * 因此start要取最大      * 优点:对于方案一,少了一些对于list截取与搜索步骤,相对儿研会少一点操作,应该会节约点时间

30310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    DS应用—最长重复子

    题目描述 求最长重复子长度(子不重叠)。例如:abcaefabcabc最长重复子abca,长度为4。...输入 测试次数t t个测试 输出 对每个测试,输出最长重复子长度,若没有重复子,输出-1....输入样例1  3 abcaefabcabc szu0123szu szuabcefg 输出样例1 4 3 -1 思路分析 这玩意其实可以用KMP去做,为什么呢,KMPNB地方不仅仅因为它可以用了找子...但是我做这道题时候还没有想那么多,我直接暴力解决…… 我直接两个循环去找最长,外循环固定子起始位置,内循环控制子终止位置,记录每次子长度,之后输出最长长度。...这里生成子函数substr参数是起始位置和选取数目,而不是起始位置和终止位置。

    25820

    扩展kmp最长回文子_算法-字符最长回文子

    大家好,又见面了,我是你们朋友全栈君。 上一篇KMP算法之后好几天都没有更新,今天介绍最长回文子。 首先介绍一下什么叫回文,就是正着读和倒着读字符顺序都是一样,eg:level,noon。...算法思想:把主每一个字符当做回文中心,向两边扩展,求出最长回文子。其中要注意奇数位回文子和偶数位回文子区别。eg:aba中心是b,而abba中心应该是bb。...代码 核心算法是l2r部分,以传入mid为回文中心计算最长回文子,其中需要注意地方有两点: l2r中第一个while循环,之前提到过要注意奇数位回文和偶数位回文,在代码中,判断中心点字符和右边字符是否相等...Manacher算法 这是几个方法中最为高效方法,时间复杂度为O(n).Manacher算法也是利用回文对称性,标记回文中间位,向两边遍历。...算法思想:Manacher采用从中间向两边遍历得到最长回文子思想,将原来进行扩展,这个算法严格要求对称,只允许有一个中心点。

    82420

    最长重复子有趣解法

    最长重复子是leetcode一道经典题目,要求找出一个字符最长重复子长度首先清楚一个概念,子是连续字符组成,子序列是不连续字符组成。)...常规做法一种常规想法就是以每个字符作为起始点,查找以这个字符开始最长,然后输出最大长度,这种做法需要两层循环,第一层循环是起始字符 s[i],第二层循环是以第一层起始字符后第一个字符开始 s...[j],如果 s[j] 出现在子 s[i, j] 中,则以 s[i] 开头最长重复子长度就是 j - i。...滑动窗口法思想是一层循环,每次循环找到以这个字符为结尾,具体做法就是:外层循环遍历所有字符,初始化窗口两边都为 0,建立一个 hashmap 用于记录当前窗口字符出现次数。...- 这个地方其实也有一次小循环,但是相比第一种方法,减少了重复比较次数。如果当前字符没有出现过,则以当前右边窗口所在字符为结尾重复子就是窗口长度。

    16500

    LeetCode - #3 最长重复子字符

    微博:@故胤道长[1]) Swift 算法题题解整理为文字版以方便大家学习与阅读。...描述 给定一个字符 s , 找出最长未重复子字符长度。 2. 示例 示例 1 输入:s = "abcabcbb" 输出:3 解释:最长重复子字符答案是"abc",长度为 3。...示例 2 输入:s = "bbbbb" 输出:1 解释:最长重复子字符答案是"b",长度为 1。...示例 3 输入:s = "pwwkew" 输出:1 解释:最长重复子字符答案是"wke",长度为 3。注意答案必须是子字符,“pwke” 是一个子列,而不是一个子字符。...maxLen = max(maxLen, i - startIdx + 1) } return maxLen } } 主要思想:使用字典存储非重复子字符下一个可能有效字符位置

    50120

    DS应用--KMP算法

    题目描述 学习KMP算法,给出主和模式,求模式在主位置 算法框架如下,仅供参考 输入 第一个输入t,表示有t个实例 第二行输入第1个实例,第三行输入第1个实例模式 以此类推 输出...第一行输出第1个实例模式next值 第二行输出第1个实例匹配位置,位置从1开始计算,如果匹配成功输出位置,匹配失败输出0 以此类推 输入样例1 3 qwertyuiop...思路分析 KMP确实NB,用KMP查找子位置首先要求出子对应next值,而求解next值过程本身就是运用KMP算法过程。...我课上学是下标从1开始,next【0】存是子长度,下一个next值需要根据前一个next值来确定,首先判断当前字符前面所组成字符前后缀(前一个字符和第一个字符)是否是相同字符,如果相同...; i <= son.size(); i++) cout << next[i]-1 << ' '; cout << endl; cout << KMP

    19330

    字符匹配KMP算法

    关于字符匹配KMP算法其实不难,只要理解字符下一步匹配需要移动个数就可以了,但是说是这么说,实际理解肯定会有或多或少问题,要是大家看完之后还是有问题有疑问同学,可以再文章底部加我~ 字符匹配...KMP算法 字符匹配是计算机基本任务之一。...许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用之一。它以三个发明者命名,起头那个K就是著名科学家Donald Knuth。 ?...这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer文章,我才真正理解这种算法。下面,我用自己语言,试图写一篇比较好懂KMP算法解释。 1. ?..."部分匹配值"就是"前缀"和"后缀"最长共有元素长度。

    1.5K40

    字符匹配KMP算法

    许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用之一。它以三个发明者命名,起头那个K就是著名科学家Donald Knuth。...这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer文章,我才真正理解这种算法。下面,我用自己语言,试图写一篇比较好懂KMP算法解释。 1....就这样,直到字符有一个字符,与搜索词第一个字符相同为止。 4. 接着比较字符和搜索词下一个字符,还是相同。 5. 直到字符有一个字符,与搜索词对应字符不相同为止。 6....KMP算法想法是,设法利用这个已知信息,不要把"搜索位置"移回已经比较过位置,继续把它向后移,这样就提高了效率。 8. 怎么做到这一点呢?..."部分匹配值"就是"前缀"和"后缀"最长共有元素长度。

    1.4K60

    模式匹配之KMP算法

    模式匹配之KMP算法 朴素模式匹配算法问题 在之前我们介绍过朴素模式匹配算法,基本思路就是用主每一个子和模式匹配,若匹配失败,都是模式后移一位再重新开始比较,将模式序号j置为1...前缀:除了最后一个字符外,字符所有头部子 后缀:除了第一个字符外,字符所有尾部子 部分匹配值:字符前缀和后缀最长相等前后缀长度 举个栗子:字符a b a b a a前缀和后缀都为...∅,部分匹配值为0 ab前缀为a,后缀为b,最长相等前后缀长度0,所以部分匹配值为0 aba前缀为{a,ab},后缀为{a,ba},部分匹配值为1 abab前缀为{a,ab,aba},后缀为{b,...那我们这样想:如果已匹配相等前缀序列中有某个后缀正好是模式前缀,那么我们就可以将模式直接移动到这个后缀位置。这就是KMP算法主要思路。 那么如何来实现这个思路呢?...[j] + 1 代码实现 KMP算法实现起来非常简短,以至于我第一次看见时觉得很不可思议,如此简短代码就可以实现这么庞大功能。

    37910

    leetcode最长回文子_最长回文子算法

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 给定一个仅包含小写字母字符,求它最长回文子长度。...所谓回文,指左右对称字符。...所谓子,指一个字符删掉其部分前缀和后缀(也可以不删)字符 (注意:记得加上while处理多个测试用例) 输入描述: 输入一个仅包含小写字母字符 输出描述: 返回最长回文子长度 示例: 输入...: cdabbacc 输出: 4 说明: abba为最长回文子 解题思路: 这题用双循环解决。...n;如果m和n相等,说明回文字符数为奇数,则回文长度为2*t+1,若m>n,说明回文字符数为偶数,则回文长度为2*t,同时更新max,max为最长回文长度。

    79720

    KMP 字符匹配算法

    KMP(Knuth-Morris-Pratt) 算法是一种常见字符匹配算法,在主字符 S 中查找字符 M 出现起始位置,通过 M 自身信息来减少无效查询次数。...KMP算法 在了解KMP算法之前,首先看两个貌似无关概念:前缀和后缀。前缀是指除最后一个字符或多个字符字符组合,后缀是指除第一个字符或多个字符字符组合。...这里最长重复字符为:AB,即部分匹配长度为 2。 不妨以 len() 表示取字符长度函数。...由概念可知,对于字符 T,若其前缀和后缀最长重复字符为 PM,则 PM 完全匹配 T 开头 len(PM) 个字符,且完全匹配 T 结尾 len(PM) 个字符。...KMP算法中查找 M 在 S 中位置,在匹配过程中,通过分析 M 与 S 已匹配字符信息来避免回退现象,过程如下: 从 S 第一个字符开始进行逐个扫描对比: ?

    1.8K30

    KMP字符匹配算法

    KMP朴素算法 原理:子pattern依次与目标target中字符比较,如果相等,继续比较下一个字符;如果不等,pattern右移一位,重新开始比较,直至匹配正确或超出target。...算法演变 我们由上面KMP朴素算法例子来引出一个问题。...KMP算法 KMP算法,是由KMP朴素算法演变而来,主要分为两步: 第一步,当字符比较出现不等时,确定下一趟比较前,应该将子pattern右移多少个字符(预处理) 第二步,子pattern右移后...总结: 第一步,其实就是KMP朴素算法对模式匹配子pattern预处理过程,上面已经给出了算法公式和代码示例 第二步,本质上就是KMP朴素算法,不同仅仅是pattern右移位数大小由其预处理过程决定...KMP算法不太容易理解,但其简洁、高效,时间复杂度为O(m+n) 其中,O(m)是pattern子预处理时间复杂度,O(n)是target目标查找时间复杂度,总时间复杂度为O(m+n) KMP

    1.5K10

    KMP字符匹配算法

    KMP算法是很经典字符匹配算法,在字符匹配过程中,只要遍历一次就可以找出所有的匹配。对于超大型字符来说,是一种非常高效算法KMP算法核心是next数组。...next数组就是在遇到不匹配字符时,匹配应该从哪些一个字符开始与被匹配开始进行比较。...简单来说就是匹配中哪些是重复出现,记住这些重复出现位置,重复字符就不要比较了,从下一个不匹配字符开始比较就可以。...下面举例来说明一下next数组 以字符st= “stst1” 为例, next数组初始为[0,0,0,0,0]。...可以看到 s[0]=s[2], 对于如果s[3]位置不匹配时,只需要从比较s[1]位置,因此next[3]=1。

    85340

    字符匹配算法KMP

    KMP由来 上一节说BM算法是最高效、最常用字符匹配算法。...最知名却是KMP,它3位作者(D.E.Knuth,J.H.Morris,V.R.Pratt),算法全称是Knuth Morris Pratt 算法,简称KMP算法。 2....KMP算法基本原理 类似于BM里概念:坏字符(不能匹配),好前缀(已经匹配那段) ? ? KMP算法目的:当遇到坏字符后,对于已经对比过好前缀,将模式多滑动几位 ?...= b[j] , 则我要在前面部分里寻找能和包含 b[j] 后缀匹配最长前缀子; b[k] 前面的最长匹配前缀长度就是 next[k],那么其后面一个字符就是 b[ next[k] ],如果它等于...代码 王争代码不好理解,找了书和别的人代码参考 /** * @description: KMP字符匹配算法 * @author: michael ming * @date: 2019/6/22

    83610

    字符匹配:KMP算法

    KMP算法是一种改进字符匹配算法,由D.E.Knuth与J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特—莫里斯—普拉特算法。...KMP算法主要分为两个步骤:字符自我匹配,目标和模式之间匹配。 ? KMP.jpg (一)字符自我匹配 所谓字符自我匹配,就是看字符中左右侧相等最长字符个数。...1; 1212左右侧有相同12,匹配字符个数为2; 12121左右侧有相同1或121,取最长121,所以匹配字符个数为3; 121212左右侧有相同12或1212,取最长...假如复杂度是mn的话,那么这个KMP算法相对于BF算法就谈不上改进了。 分析一下这个while循环,实际上它作用就是让j不断变小,导致p不断右移。...显然,在i=0到i=n-1整个比较过程中,j最多只能往右挪移n次,所以while循环平均复杂度最多为1,所以KMP算法是线性,复杂度是n,而不是mn。这就是KMP算法存在价值。

    2.5K100
    领券