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