方法1:KMP算法
题目1:字符串出现的第一个位置
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例:
输入: haystack = “hello”, needle = “ll”
输出: 2
KMP算法:分为两部分,b数组 和 正式匹配
b数组 部分:找每个字符前的 最大相等前后缀长度:
比如 aba --> 一个前缀是 a,一个后缀是 a,最大相等前后缀长度 为 1
比如 baba --> 一个前缀是 ba,一个后缀是 ba,最大相等前后缀长度 为 2
比如 ababa --> 一个前缀是 aba,一个后缀是 aba,最大相等前后缀长度 为 3
图示即为b数组的创建。
代码部分:
class Solution(object):
def strStr(self, haystack, needle):
"""
:type haystack: str
:type needle: str
:rtype: int
"""
if len(needle)==0:
return 0
b=self.Creat_btable(needle)
j,i=0,0
while (j < len(haystack)):
if (needle[i] == haystack[j]):
i=i+1
j = j + 1
elif (i >0 and needle[i] != haystack[j]) :
i=b[i]
elif(i==0 and needle[i] != haystack[j]):
j = j + 1
if i==len(needle):
return j-len(needle)
return -1
def Creat_btable(self, needle):
j = -1
i = 0 # j在后面,i在前面
b=[j]
while (i < len(needle)):
while (j >= 0 and needle[i] != needle[j]):
j = b[j]
i=i+1
j=j+1
b.append(j)
return b
方法2:字典序的利用
题目2:去除重复字母
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
输入:s = “bcabc”
输出:“abc”
题解:(构造栈)
1.因为不能打乱相对位置—即输入中排在输出第一个字母位置前的字母都不能出现,所以要在保证每个字母至少出现一次的前提下再考虑字典序排列
2.根据第1点可以考虑使用单调栈来保证字典序排列,根据第2点我们给元素出栈时加上限制条件,只有在栈顶元素字典序靠后,且在之后还有出现次数才弹出栈.同时压栈时应该注意栈中没有出现过该元素才能压栈.
class Solution:
def removeDuplicateLetters(self, s: str) -> str:
stack = []
for idx, char in enumerate(s):
if char in stack:continue
while stack and char < stack[-1] and stack[-1] in s[idx:]:
stack.pop()
stack.append(char)
return "".join(stack)