接着昨天的学习:Leetcode数据结构学习day3——字符串1-优快云博客
4. 字符串匹配问题
字符串匹配(String Matching):给定字符串 T 和 p,在主串 T 中寻找子串 p。
而按照模式串的个数,我们可以将字符串匹配问题分为:「单模式串匹配问题」和「多模式串匹配问题」。
4.1 单模式串匹配问题
单模式匹配问题(Single Pattern Matching):给定一个文本串 ,再给定一个特定模式串 。常见的解决方法包括朴素字符串匹配算法、KMP算法、Boyer-Moore算法等。
朴素字符串匹配算法:从文本的第一个字符开始,逐个字符与目标模式串进行比较,直到找到匹配或遍历完整个文本。这是一种简单直接的方法,但对于大规模文本和模式串可能效率较低。
KMP算法(Knuth-Morris-Pratt算法):利用模式串内部的信息,避免不必要的字符比较,从而提高匹配效率。
Boyer-Moore算法:利用模式串中字符出现的位置和不匹配字符的规律,跳过尽可能多的文本字符进行比较,以减少比较次数。
4.2 多模式串匹配问题
多模式串匹配问题是在一个文本字符串中查找多个模式串的出现情况。这种情况下,我们需要同时匹配多个模式串并确定它们的位置。常见的解决方法包括Trie树、AC自动机等。
Trie树:建立一个树形结构,用于存储多个模式串。通过遍历文本字符串并在Trie树中匹配,可以高效地找到多个模式串的出现位置。
AC自动机(Aho-Corasick自动机):是在Trie树的基础上进行改进,使其能够同时匹配多个模式串。AC自动机构建了一个有限状态机,可以高效地在文本字符串中找到多个模式串的出现位置。
leedcode刷题
344. 反转字符串
题目内容:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 |
本来使用s[::-1],但是发现切片操作会产生新的数组,不符合题目要求。
正确解法:使用双指针
双指针的基本思想是使用两个指针,分别指向数组或字符串的不同位置,通过移动指针来解决问题。这两个指针可以同时从数组的两端开始,也可以从同一端开始并相向移动。通常用于遍历数组或字符串,并且可以在不使用额外空间的情况下高效地解决问题。
双指针常用的应用场景:数组或字符串的反转、快慢指针(判断链表是否有环、寻找链表的中间节点)、两数之和、归并两个有序数组(可以使用两个指针分别指向两个数组的末尾位置,通过比较指针指向的元素大小来选择较大的元素放入合并后的数组中)
优点:在一次遍历中完成操作,时间复杂度通常为 O(n)。使用了常数个指针,所以它的空间复杂度通常为 O(1),不需要额外的存储空间。
解题代码:
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left=0
right=len(s)-1
while left < right:
s[left],s[right]=s[right],s[left]
left=left+1
right=right-1