day8 代码随想录 | 344 541 反转字符串 28 KMP 字符字串匹配

344 反转字符串 

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

这个题不难,其实用用指针的思路就可以。一个在左边left,一个在最右边right,然后交换就可以,中止条件是相遇。这里不用left=right,当相等的时候,是指向同一个字符,没必要换了。

def reverseString(s: List[str]) -> None:
    left = 0
    right = len(s)-1
    while right > left:
        s[left], s[right] = s[right], s[left]
    
        left += 1
        right -= 1

    

541 反转字符串 

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

这个题目看起很复杂,其实不难。他每次定位的区间是i:i+2k。然后在对在这里面的字符根据题意做反转。当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。

def reverseStr(s: str, k: int) -> str:
    res = list(s)

    for i in range(0, len(s), 2*k):
        if (i + k <= len(s)):
            s[i: i+k] = reverseString(s[i: i+k])
        
        else:
            s[i: len(s)] = reverseString(s[i: len(s)])
    
    return ''.join(res)


def reverseString(s: List(str)):
    if len(s) == 0:
        return
    left = 0
    right = len(s) - 1
    while right > left:
        s[left], s[right] = s[right], s[left]

        left += 1
        right -= 1

    return s

28 字串匹配

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

这个题,考察的其实就是KMP算法。如果你不会,那就只能用暴力搜索法了。关于KMP算法的讲解和步骤的具体细节可以参考这里的代码随想录。核心就是 当你发现不匹配,不需要从头开始匹配,而是根据前缀表,跳到相应的位置在进行匹配。前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。因此,整个KMP算法的核心就两个。如何求前缀表? 如何根据前缀表来进行匹配。

我们先看暴力解法

暴力解法


def strStr(haystack: str, needle: str) -> int:
    n1 = len(haystack)
    n2 = len(needle)
    if n1 - n2 < 0:
        return -1
    
    for i in range(n1-n2+1):
        if haystack[i: i+n2] == needle:
            return i
    return -1
        
    

KMP 算法


class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if len(needle) == 0:
            return 0
        next = [0] * len(needle)
        j = 0
        
        self.getNext(next, needle)
        
        for i in range(len(haystack)):
            while ( j > 0 and needle[j] != haystack[i]):
                j = next[j-1]
            
            if haystack[i] == needle[j]:
                j += 1
            
            if j == len(needle)-1:
                return i-len(needle) + 1
        return -1

    
    def getNext(self, next, s):
        j = 0
        next[0] = 0
        
        for i in range(1, len(s)):
            while ( j > 0 and s[j] != s[i]):
                j = next[j-1]

            if s[j] == s[i]:
                j += 1

            next[i] = j

    
            
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值