文章目录
- 剑指 Offer 58 - II. 左旋转字符串
- 分析
- 代码(开辟额外空间)
- 通过截图
- 代码(多次反转)
- 通过截图
- 代码(切片拼接)
- 通过截图
- 28. 实现 strStr()
- 分析
- 代码(in关键字)
- 通过截图
- 代码(BF算法)
- 通过截图
剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
限制:
1 <= k < s.length <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
- 1.开辟额外空间,利用双指针,将左指针的值赋值给右指针指向的额外空间
- 2.字符串经过两次反转会回到原来的串,我们对n位前(包括n)和n位后的字符串进行翻转,现在的字符串的组成就变为
“n位前(包括n)翻转的字符串+”n位后翻转的字符串
。总体再翻转一次,就变为n位后的原来字符串+n位前(包括n)的原来字符串
,所以达到题目要求 - 3.直接切片拼接也可以
代码(开辟额外空间)
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
l = list(s)
left = 0
right = len(l)
l.extend([" "]*n)
while right < len(l):
l[right] = l[left]
left+=1
right+=1
return "".join(l[n:])
通过截图
代码(多次反转)
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
l = list(s)
# 反转前n个字符串
left = 0
right = n-1
while left < right:
l[left],l[right] = l[right],l[left]
left+=1
right-=1
# 反转n位之后的字符串
left = n
right = len(l)-1
while left < right:
l[left],l[right] = l[right],l[left]
left+=1
right-=1
# 反转字符串
left = 0
right = len(l)-1
while left < right:
l[left],l[right] = l[right],l[left]
left+=1
right-=1
return "".join(l)
通过截图
代码(切片拼接)
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
return s[n:]+s[0:n]
通过截图
28. 实现 strStr()
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
示例 1:
输入:haystack = "hello", needle = "ll"
输出:2
示例 2:
输入:haystack = "aaaaa", needle = "bba"
输出:-1
示例 3:
输入:haystack = "", needle = ""
输出:0
提示:
0 <= haystack.length, needle.length <= 5 * 104
haystack 和 needle 仅由小写英文字符组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-strstr
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
- 1.利用in关键字查找是否存在,如果存在用index寻找下标,不存在就返回-1
- 2.暴力匹配(BF算法),取与模式串相同长度的主串切片进行匹配,不匹配就移动到下一位,比如模式串长度为n,第一次匹配0~n-1位,第二次匹配1到n位,依此类推。主要注意空串需要额外讨论(因为空串没长度,无法参与遍历)。
- 以下算法后续学会再补充
- 3.KMP算法
- 4.RK算法
- 5.BM算法
代码(in关键字)
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
if needle in haystack:
idx = haystack.index(needle)
else:
idx = -1
return idx
通过截图
代码(BF算法)
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
if needle == "":
return 0
n = len(needle)
for i in range(len(haystack)-n+1):
if(haystack[i:i+n] == needle):
return i
return -1
通过截图