代码随想录算法训练营 Day 8

1 minute read

Published:

Q1. LeetCode 151

解法1. 将字符串按空格分开,翻转,然后输出

class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.strip().split()
        s = s[::-1]

        return ' '.join(word for word in s)

解法2: 思路类似,但采用双指针

class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.strip().split()
        left, right = 0, len(s) - 1

        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1

        return ' '.join(word for word in s)

解法3. 1. 删除头尾可能出现的空格;2. 将整个字符串进行翻转;3. 将其中的每个单词进行翻转

class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.strip()
        s = s[::-1]

        return ' '.join(word[::-1] for word in s.split())

复杂度分析

时间复杂度:O($n$) 空间复杂度:O($n$)

Take some notes

理解其他语言的写法,算法的考查要点

Q2. KamaCoder 55

思路:与Q1类似,先将整个字符串翻转,然后将字符串看作两部分:前k个和其余部分,对这两个部分分别进行翻转

k = int(input())
s = input()

# reverse the whole string
s = s[::-1]
# reverse the first k characters and the rest characters respectively
s = s[:k][::-1] + s[k:][::-1]
print(s)

复杂度分析

时间复杂度:O($n$) 空间复杂度:O($n$)

Q3. LeetCode 28

解法1: 回溯法

思路:遍历字符串haystack和needle,若对应字符相等,则继续;若不相等,则将haystack指针所指位置需要减去当前needle遍历过的长度

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if len(haystack) == 0:
            return 0
        
        n = len(haystack)
        
        i = 0
        j = 0
        while i < n:
            if haystack[i] == needle[j]:
                j += 1
                if j == len(needle):
                    return i - len(needle) + 1
            else:
                i -= j
                j = 0 

            i += 1
        
        return -1

解法2: KMP算法

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if len(needle) == 0:
            return 0
        
        next = self.getNext(needle)

        j = 0
        for i in range(len(haystack)):
            while j > 0 and haystack[i] != needle[j]:
                j = next[j - 1]
            if haystack[i] == needle[j]:
                j += 1
            if j == len(needle):
                return i - len(needle) + 1
        
        return -1
    
    def getNext(self, s):
        j = 0
        next = [0] * len(s)
        next[0] = j
        for i in range(1, len(s)):
            # 先判断是否不相等,因为相等的情况会更新j
            while j > 0 and s[i] != s[j]:
                j = next[j - 1]
            if s[i] == s[j]:
                j += 1
            next[i] = j

        return next 

复杂度分析

时间复杂度:O($n$) 空间复杂度:O(1)

TODO

完成Q4,巩固并总结KMP算法