字符串
abant2
世界上最菜的arcem
展开
-
leetcode 214 左边插入构建最短回文串 马拉车+kmp两种解法
解法一:马拉车 首先要把这个题剖析一下,变得简单。其实这个题是一个找最长回文串前缀的题,比如aabaa + cc这个字符串,我们找到最长的回文前缀aabaa,然后只要把后面两个字符反转一下加在前面即可。 根据上面的分析,就可以使用马拉车算法计算dp[i] = i的下标,并记录最大,时间复杂度为 O(N)。 class Solution { public: string shortestPalindrome(string s) { string ss = "#"; f.原创 2021-08-02 14:23:47 · 107 阅读 · 0 评论 -
马拉车算法 正确简洁代码版
马拉车算法要计算的是一个dp数组,数组中每个元素代表以当前元素为下标,可扩展的最大半径。注:在我们通过井号预处理后,这个最大半径就是回文串的长度。 状态转移:我们持续更新当前能到达的最远右端,如果新元素包含在内,可以通过看对称元素的回文长度减少运算量,若不包含只能从头开始。 在包含的情况下,只有回文长度等于maxRight-i时才需要重新走,可以看我之前写的leetcode 5里面的解释。 在写代码时,我们不用考虑这些,如果i在R内部,就考虑dp[mirror]和maxRight-i的最小值,之后一律做中心原创 2021-08-02 13:32:01 · 123 阅读 · 0 评论 -
leetcode 459 重复子字符串判断 kmp
此题最常见的是暴力做法,判断每个小于n/2的子串是否满足即可,复杂度为 O(N2)O(N^2)O(N2) 更高效的做法是降维打击,用另一种角度来考虑问题,即,如果满足条件,那么经过一定次数的旋转,此字符串会恢复原状。 所以,我们定义一个新串为两个s相加,并去掉首尾字母。然后判断原字符串是否是这个串的子串即可,变成了一个旋转问题。 对于字符串匹配,当然要使用的就是kmp算法,直接上代码。 class Solution { public: bool repeatedSubstringPattern(s.原创 2021-07-26 22:18:14 · 146 阅读 · 0 评论 -
leetcode 14 最长公共前缀 差异最大字符串
这个题是比较简单的一个题目,O(NM)遍历计算即可,这是一个朴素的做法。其中,N是字符串个数,M是字符串长度。 这里介绍一种比较神奇的做法,首先将字符串排序,然后只需比较第一个和最后一个即可。这样做的复杂度可以变成O(MNlogN + M),没什么提升。 道理:第一个和最后一个字符串可以认为是相差最大的字符串,所以可以比较,可以作为一个定理来用。 class Solution { public: string longestCommonPrefix(vector<string>&.原创 2021-07-22 17:17:01 · 53 阅读 · 0 评论 -
KMP算法详解 理论+代码
此篇博客将KMP算法在字符串匹配中的应用。 例:文本串:aabaabaaf 模式串:aabaaf 1️⃣ 理论篇 正常的匹配思路,对文本串的每一个位置,往右遍历模式串长度,若匹配则返回,不匹配则继续文本串下一个位置,复杂度 O(mn)O(mn)O(mn) KMP算法:设置双指针,分别指向文本串和模式串的其中一个位置,文本串指针永不回溯,当不匹配时回溯模式串指针,复杂度 O(n)O(n)O(n) 在讲解KMP算法前,先介绍什么是前缀和后缀,对于字符串aab,前缀:a,aa,后缀:b,ab 我们定义这样一个结构原创 2021-07-12 21:58:26 · 191 阅读 · 0 评论