一、LeetCode28. 找出字符串中第一个
1:题目描述(28. 找出字符串中第一个)
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
2:解题思路
直接遍历字符串haystack,每次截取字符串needle长度的子串,与needle进行对比,看子串与needle是否相等,相等则返回子串的起始位置,不相等则继续遍历,直到遍历到最后一个与needle长度相等的子串。
class Solution:
def strStr(self, haystack, needle):
needle_len = len(needle)
haystack_len = len(haystack)
i =0
# 当i小于haystack的长度,并且剩余的子串长度大于等于needle的长度时
while i <= haystack_len and haystack_len-i >= needle_len:
s = haystack[i:i+needle_len]
if needle == s:
return i
else:
i += 1
return -1
二、LeetCode459. 重复的子字符串
1:题目描述(459. 重复的子字符串)
给定一个非空的字符串 s
,检查是否可以通过由它的一个子串重复多次构成。
2:解题思路
解法一:遍历字符串s ,获取每个以首字母开头的子串s1,然后在除去s1剩下的字符串中,去判断是否由子串s1组成。
class Solution:
def repeatedSubstringPattern(self, s):
# # 遍历寻找子串,判断s是否由其中一个子串组成
for i in range(len(s)): # 遍历字符串,寻找以首字母开头的子串s1
s1 = s[:i+1]
j = i+1 # 从s1子串结束的下一个位置,开始遍历剩余的字符串
while j < len(s): #
s2 = s[j:j+len(s1)] # 在剩余的字符串中,每次从上一个子串结束的下一个位置,取s1长度的子串s2
j += len(s1) # 修改下一个子串开始的位置
if s1 != s2: # 当有一次s1 != s2, 则说明字符串s不是由s1组成的,结束本层循环
break
if j == len(s): # 判断此时j是否等于字符串s的长度,不等于,继续遍历字符串s,寻找下一个子串s1
if s1 == s or s1 != s2: # j等于字符串s的位置,s1与s相等,或者最后得到的s2 != s1,返回False
return False
return True # 否则,返回True
解法二:将字符串s拼接成一个新的字符串s1=s+s,把字符串s1的首尾字符去掉,得到一个新的字符串s2,判断字符串s是否在字符串s2中,在,则表示s可由一个字符串重复多次组成;不存在则表示s不可由一个字符串重复多次组成。
class Solution:
def repeatedSubstringPattern(self, s):
# 将字符串拼接成一个新的字符串
s1 = s + s
# 去除s1的首尾两个字符
s2 = s1[1:-1]
if s in s2: # 字符串s在s2中,说明s是由它的一个子串重复组成
return True
else: # 字符串s不在s2中,说明s不是由它的一个子串重复组成
return False
今日总结:
KMP算法还不是很理解,使用其他的解法把这两道写了写,459. 重复的子字符串这道题使用暴力解法(也就是解法一)还是捣鼓了很久。对之前的还没有进行总结,后面总结吧。