数据结构与算法~字符串

题目

字符串基础问题
https://leetcode-cn.com/problems/to-lower-case/ √
https://leetcode-cn.com/problems/length-of-last-word/ √
https://leetcode-cn.com/problems/jewels-and-stones/ √
https://leetcode-cn.com/problems/first-unique-character-in-a-string/ √
https://leetcode-cn.com/problems/string-to-integer-atoi/ √
字符串操作问题
https://leetcode-cn.com/problems/longest-common-prefix/description/ √
https://leetcode-cn.com/problems/reverse-string √
https://leetcode-cn.com/problems/reverse-string-ii/ √
https://leetcode-cn.com/problems/reverse-words-in-a-string/ √
https://leetcode-cn.com/problems/reverse-words-in-a-string-iii/ √
https://leetcode-cn.com/problems/reverse-only-letters/ √
异位词问题
https://leetcode-cn.com/problems/valid-anagram/ √
https://leetcode-cn.com/problems/group-anagrams/ √
https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/ √
回文串问题
https://leetcode-cn.com/problems/valid-palindrome/ √
https://leetcode-cn.com/problems/valid-palindrome-ii/ √
https://leetcode-cn.com/problems/longest-palindromic-substring/
最长子串、子序列问题
https://leetcode-cn.com/problems/longest-common-subsequence/
https://leetcode-cn.com/problems/edit-distance/
https://leetcode-cn.com/problems/longest-palindromic-substring/

字符串定义

python 和 Java字符串是不可变的,c/C++字符串是可变的

字符串遍历

在这里插入图片描述

字符串比较

在这里插入图片描述

Atoi代码示例

字符串匹配算法

  1. 我们用的最多的就是编程语言提供的字符串查找函数,比如 Java 中的 indexOf(),Python 中的 find() 函数等,它们底层就是依赖接下来要讲的字符串匹配算法。
  2. 简单的 :BF算法和 RF算法
  3. 复杂却高效:BM算法和 KMP算法

BF算法

  1. Brute Force,暴力匹配算法,简单好懂,性能不高
  2. 主串模式串在这里插入图片描述
  3. 思想:我们在主串中,检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的
  4. 这种算法的最坏情况时间复杂度是 O(n*m)。但在实际的开发中,它却是一个比较常用的字符串匹配算法。第一,实际的软件开发中,大部分情况下,模式串和主串的长度都不会太长。而且每次模式串与主串中的子串匹配的时候,当中途遇到不能匹配的字符的时候,就可以就停止了,不需要把 m 个字符都比对一下。所以,尽管理论上的最坏情况时间复杂度是 O(n*m),但是,统计意义上,大部分情况下,算法执行效率要比这个高很多。第二,朴素字符串匹配算法思想简单,代码实现也非常简单。简单意味着不容易出错,如果有 bug 也容易暴露和修复。在工程中,在满足性能要求的前提下,简单是首选。这也是我们常说的KISS(Keep it Simple and Stupid)设计原则。

RF算法

  1. Rabin-Karp算法, 两个发明人的名字。
  2. RF是BF的升级版,在BF 的基础上引入哈希
  3. RK 算法的思路是这样的:我们通过哈希算法对主串中的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了(这里先不考虑哈希冲突的问题,后面我们会讲到)。因为哈希值是一个数字,数字之间比较是否相等是非常快速的,所以模式串和子串比较的效率就提高了
  4. ,通过哈希算法计算子串的哈希值的时候,我们需要遍历子串中的每个字符。尽管模式串与子串比较的效率提高了,但是,算法整体的效率并没有提高。
  5. 我们假设要匹配的字符串的字符集中只包含 K 个字符,我们可以用一个 K 进制数来表示一个子串,这个 K 进制数转化成十进制数,作为子串的哈希值。
  6. 整个 RK 算法包含两部分,计算子串哈希值和模式串哈希值与子串哈希值之间的比较。第一部分,我们前面也分析了,可以通过设计特殊的哈希算法,只需要扫描一遍主串就能计算出所有子串的哈希值了,所以这部分的时间复杂度是 O(n)。模式串哈希值与每个子串哈希值之间的比较的时间复杂度是 O(1),总共需要比较 n-m+1 个子串的哈希值,所以,这部分的时间复杂度也是 O(n)。所以,RK 算法整体的时间复杂度就是 O(n)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值