题目
字符串基础问题
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代码示例
字符串匹配算法
- 我们用的最多的就是编程语言提供的字符串查找函数,比如 Java 中的 indexOf(),Python 中的 find() 函数等,它们底层就是依赖接下来要讲的字符串匹配算法。
- 简单的 :BF算法和 RF算法
- 复杂却高效:BM算法和 KMP算法
BF算法
- Brute Force,暴力匹配算法,简单好懂,性能不高
- 主串 和 模式串
- 思想:我们在主串中,检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的
- 这种算法的最坏情况时间复杂度是 O(n*m)。但在实际的开发中,它却是一个比较常用的字符串匹配算法。
第一,实际的软件开发中,大部分情况下,模式串和主串的长度都不会太长。而且每次模式串与主串中的子串匹配的时候,当中途遇到不能匹配的字符的时候,就可以就停止了,不需要把 m 个字符都比对一下。所以,尽管理论上的最坏情况时间复杂度是 O(n*m),但是,统计意义上,大部分情况下,算法执行效率要比这个高很多。第二,朴素字符串匹配算法思想简单,代码实现也非常简单。简单意味着不容易出错,如果有 bug 也容易暴露和修复。在工程中,在满足性能要求的前提下,简单是首选。这也是我们常说的KISS(Keep it Simple and Stupid)设计原则。
RF算法
- Rabin-Karp算法, 两个发明人的名字。
- RF是BF的升级版,在BF 的基础上引入哈希
- RK 算法的思路是这样的:我们通过哈希算法对主串中的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了(这里先不考虑哈希冲突的问题,后面我们会讲到)。因为哈希值是一个数字,数字之间比较是否相等是非常快速的,所以模式串和子串比较的效率就提高了。
- ,通过哈希算法计算子串的哈希值的时候,我们需要遍历子串中的每个字符。尽管模式串与子串比较的效率提高了,但是,算法整体的效率并没有提高。
- 我们假设要匹配的字符串的字符集中只包含 K 个字符,我们可以用一个 K 进制数来表示一个子串,这个 K 进制数转化成十进制数,作为子串的哈希值。
- 整个 RK 算法包含两部分,计算子串哈希值和模式串哈希值与子串哈希值之间的比较。第一部分,我们前面也分析了,可以通过设计特殊的哈希算法,只需要扫描一遍主串就能计算出所有子串的哈希值了,所以这部分的时间复杂度是 O(n)。模式串哈希值与每个子串哈希值之间的比较的时间复杂度是 O(1),总共需要比较 n-m+1 个子串的哈希值,所以,这部分的时间复杂度也是 O(n)。所以,
RK 算法整体的时间复杂度就是 O(n)。