例题合集:

  • 方法1:KMP算法
    • 题目1:字符串出现的第一个位置
  • 方法2:字典序的利用
    • 题目2:去除重复字母

方法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 0b=self.Creat_btable(needle)j,i=0,0while (j < len(haystack)):if (needle[i] == haystack[j]):i=i+1j = j + 1elif (i >0 and needle[i] != haystack[j]) :i=b[i]elif(i==0 and needle[i] != haystack[j]):j = j + 1if i==len(needle):return j-len(needle)return -1def Creat_btable(self, needle):j = -1i = 0  # j在后面,i在前面b=[j]while (i < len(needle)):while (j >= 0 and needle[i] != needle[j]):j = b[j]i=i+1j=j+1b.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:continuewhile stack and char < stack[-1] and stack[-1] in s[idx:]:stack.pop()stack.append(char)return "".join(stack)

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

  1. 20210325:力扣递归,回溯类型题目合集

    力扣递归,回溯类型题目合集 题目 思路与算法 代码实现 写在最后 题目 子集 2. 90. 子集 II 3. 40. 组合总和 II 4. 22. 括号生成 思路与算法 子集:注释的很详细,递归生成子 ...

  2. 珍宝鸭的力扣练习(8):贪心算法练习合集

    1.贪心算法适用的问题 贪心策略适用的前提是:局部最优策略能导致产生全局最优解. 实际上,贪心算法适用的情况很少.一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可 ...

  3. 珍宝鸭的力扣练习(2):指针法的解题合集

    题目合集: 题目1:水桶最短板 题目2:目标值寻找 题目3:2数组合并 题目4:第一个不重复的数字 题目5:和为s的两个数字 题目6:倒序打印 快慢指针 题目1:调整数组顺序使奇数位于偶数前面 #双指 ...

  4. 珍宝鸭的力扣练习(17):有限状态机

    确定有限状态自动机(以下简称「自动机」)是一类计算模型.它包含一系列状态,这些状态中: 1.有一个特殊的状态,被称作「初始状态」. 2.还有一系列状态被称为「接受状态」,它们组成了一个特殊的集合.其中 ...

  5. 珍宝鸭的力扣练习(14):栈操作合集

    通用方法:辅助栈 考虑借用一个辅助栈 stack ,模拟 压入 / 弹出操作的排列.根据是否模拟成功,即可得到结果. 题目合集: 题目1:栈的压入.弹出序列 题目2: 双栈实现队列 ) 题目1:栈的压 ...

  6. 珍宝鸭的力扣练习(11):基本数学问题

    题型: 题型1:特殊数字 题目1:质数统计 题目2:丑数统计 题型2:设计公式 题目1:设计整数次方 题目2:设计1+2+...+n 题型3:统计类 题目1:统计1的个数 题目2:数字序列 题型1:特 ...

  7. 珍宝鸭的力扣练习(3):位运算合集

    题目合集: 题目1: 二进制中1的个数 题目2:只出现一次的数(别的2次) 题目3:2个只出现一次的数(别的2次) 题目3: 只出现一次的数(别的3次) 题目1: 二进制中1的个数 请实现一个函数,输 ...

  8. 珍宝鸭的力扣练习(7):分治法题目合集

    动态规划和分治法的区别 动态规划也是一种分治思想(比如其状态转移方程就是一种分治),但与分治算法不同的是,分治算法是把原问题分解为若干个子问题,自顶向下求解子问题,合并子问题的解,从而得到原问题的解. ...

  9. 珍宝鸭的力扣练习(10):数组特殊方法合集

    题目合集: 方法1:二分法 例题1:不在排序数组内的数字 例题2:target开始与结束位置 例题3:旋转数组的最小值 例题4:排序数组中target的个数 方法2:摩尔投票法 例题1:不在数组内的数 ...

最新文章

  1. C语言经典例4-某一天是这一年的第几天
  2. mysql 函数索引_MySQL 8.0 索引特性1-函数索引
  3. textaligncenter仍然不居中_戊唑醇和己唑醇都是杀菌剂,有啥不同?真正懂的人不多...
  4. 【译】 Google: Still in The Search 搜索巨人Google的伟大转变 (二)
  5. linux mysql timestamp_MYSQL中TIMESTAMP类型的使用
  6. java logout session_会话跟踪技术--session的使用
  7. mac android屏幕演示,如何在Mac上录制Android设备的屏幕 | MOS86
  8. 栈方法 LIFO - 队方法 FIFO
  9. torch.nn与torch.nn.functional
  10. ev3的c语言编程软件,乐高EV3编程软件教育版下载
  11. Linux内核学习开始
  12. pe系统测试软件,使用PE系统显示器测试工具检测电脑屏幕的方法
  13. C盘哪些文件可以删除?windows7瘦身攻略
  14. 2020云服务平台领域最具商业合作价值企业盘点
  15. 卖油的都开始卖菜了,打败你的往往不是对手
  16. java hevc和heif_关于 iOS 和 macOS 的 HEVC 和 HEIF
  17. iOS-App Logo和闪屏图尺寸
  18. Python----凯撒密码、将字符转换成ASCLL函数、将ASCLL码转换成字符函数
  19. 关于支付宝的支付流程
  20. Android蓝牙开发之一:打开、关闭蓝牙

热门文章

  1. sas和python哪个更容易发胖_BEC商务英语_沙拉vs.巨无霸:哪个更容易发胖?_沪江英语...
  2. Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
  3. 免费python基础笔记_python的基础练习笔记
  4. 旧文重发 | 爬虫工程师必须知道的几个法律案例
  5. python编程语言符号大全_Python基础学习篇章三分析
  6. 春晚 “北帝” “东邪”
  7. 实现敌人(怪物)的简单AI(自动巡逻、看到玩家攻击玩家、玩家离开恢复自动巡逻)
  8. simulink模型中的仿真时间和仿真步长的区别
  9. php to myr,MYR是什么意思
  10. 课程学习笔记1:自然辩证法概论