珍宝鸭的力扣练习(1):字符串特殊方法合集

方法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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值