LeetCode刷题指南
第 0 章 hot100
0.1 哈希
0.2 双指针
0.3 滑动窗口
0.4 子串
0.5 普通数组
0.6 矩阵
0.7 链表
0.8 二叉树
0.9 图论
0.10 回溯
0.11 二分查找
0.12 栈
0.13 堆
0.14 贪心算法
0.15 动态规划
0.16 多维动态规划
0.17 技巧
第0-1章 面试经典150
0.1 数组/字符串
0.2 双指针
0.3 滑动窗口
链表
二叉树
第 1 章 最易懂的贪心算法
1.1 算法解释
1.2 分配问题
1.3 区间问题
1.4 练习
第 2 章 玩转双指针
2.1 算法解释
2.2 Two Sum
2.3 归并两个有序数组
2.4 滑动窗口
2.5 快慢指针
2.6 练习
第 3 章 居合斩!二分查找
3.1 算法解释
3.2 求开方
3.3 查找区间
3.4 查找峰值
3.5 旋转数组查找数字
3.6 练习
第 4 章 千奇百怪的排序算法
4.1 常用排序算法
4.2 快速选择
4.3 桶排序
4.4 练习
第 5 章 一切皆可搜索
5.1 算法解释
5.2 深度优先搜索
5.3 回溯法
5.4 广度优先搜索
5.5 练习
第 6 章 深入浅出动态规划
6.1 算法解释
6.2 基本动态规划:一维
6.3 基本动态规划:二维
6.4 分割类型题
6.5 子序列问题
6.6 背包问题
6.7 字符串编辑
6.8 股票交易
6.9 练习
第 7 章 化繁为简的分治法
7.1 算法解释
7.2 表达式问题
7.3 练习
第 8 章 巧解数学问题
8.1 引言
8.2 公倍数与公因数
8.3 质数
8.4 数字处理
8.5 随机与取样
8.6 练习
第 9 章 神奇的位运算
9.1 常用技巧
9.2 位运算基础问题
9.3 二进制特性
9.4 练习
第 10 章 妙用数据结构
10.1 C++ STL
10.2 Python 常用数据结构
10.3 数组
10.4 栈和队列
10.5 单调栈
10.6 优先队列
10.7 双端队列
10.8 哈希表
10.9 多重集合和映射
10.10 前缀和与积分图
10.11 练习
第 11 章 令人头大的字符串
11.1 引言
11.2 字符串比较
11.3 字符串理解
11.4 字符串匹配
11.5 练习
第 12 章 指针三剑客之一:链表
12.1 数据结构介绍
12.2 链表的基本操作
12.3 其它链表技巧
12.4 练习
第 13 章 指针三剑客之二:树
13.1 数据结构介绍
13.2 树的递归
13.3 层次遍历
13.4 前中后序遍历
13.5 二叉查找树
13.6 字典树
13.7 练习
第 14 章 指针三剑客之三:图
14.1 数据结构介绍
14.2 二分图
14.3 拓扑排序
14.4 练习
第 15 章 更加复杂的数据结构
15.1 引言
15.2 并查集
15.3 复合数据结构
15.4 练习
第16章 面试题
第 17 章 十大经典排序算法
README
本文档使用 MrDoc 发布
-
+
首页
11.2 字符串比较
# 11.2 字符串比较 ## [242. Valid Anagram](https://leetcode.com/problems/valid-anagram/) ### 题目描述 判断两个字符串包含的字符是否完全相同。 ### 输入输出样例 输入两个字符串,输出一个布尔值,表示两个字符串是否满足条件。 ``` Input: s = "anagram", t = "nagaram" Output: true ``` ### 题解 我们可以利用哈希表或者数组统计两个数组中每个数字出现的频次,若频次相同,则说明它们包含的字符完全相同。 ```py def isAnagram(s: str, t: str) -> bool: if len(s) != len(t): return False counter = Counter(s) counter.subtract(t) return all(v == 0 for v in counter.values()) ``` ## [205. Isomorphic Strings](https://leetcode.com/problems/isomorphic-strings/) ### 题目描述 判断两个字符串是否同构。同构的定义是,可以通过把一个字符串的某些相同的字符转换成另一些相同的字符,使得两个字符串相同,且两种不同的字符不能够被转换成同一种字符。 ### 输入输出样例 输入两个字符串,输出一个布尔值,表示两个字符串是否满足条件。 ``` Input: s = "paper", t = "title" Output: true ``` 在这个样例中,通过把 s 中的 p、a、e、r 字符转换成 t、i、l、e 字符,可以使得两个字符串相同。 ### 题解 我们可以将问题转化一下:记录两个字符串每个位置的字符第一次出现的位置,如果两个字符串中相同位置的字符与它们第一次出现的位置一样,那么这两个字符串同构。举例来说,对于“paper”和“title”,假设我们现在遍历到第三个字符“p”和“t”,发现它们第一次出现的位置都在第一个字符,则说明目前位置满足同构。同样的,我们可以用哈希表存储,也可以用一个长度为 128 的数组(ASCII 定义下字符的总数量)。 ```py def isIsomorphic(s: str, t: str) -> bool: s_init, t_init = [0] * 128, [0] * 128 for i in range(len(s)): if s_init[ord(s[i])] != t_init[ord(t[i])]: return False s_init[ord(s[i])] = t_init[ord(t[i])] = i + 1 return True ``` ## [647. Palindromic Substrings](https://leetcode.com/problems/palindromic-substrings/) ### 题目描述 给定一个字符,求其有多少个回文子字符串。回文的定义是左右对称。 ### 输入输出样例 输入是一个字符串,输出一个整数,表示回文子字符串的数量。 ``` Input: "aaa" Output: 6 ``` 六个回文子字符串分别是 ["a","a","a","aa","aa","aaa"]。 ### 题解 我们可以从字符串的每个位置开始,向左向右延长,判断存在多少以当前位置为中轴的回文子字符串。 ```py # 辅函数。 def extendSubstrings(s: str, l: int, r: int) -> int: count, n = 0, len(s) while l >= 0 and r < n and s[l] == s[r]: count += 1 l -= 1 r += 1 return count # 主函数。 def countSubstrings(s: str) -> int: return sum( # 奇数长度 + 偶数长度。 extendSubstrings(s, i, i) + extendSubstrings(s, i, i + 1) for i in range(len(s)) ) ``` ## [696. Count Binary Substrings](https://leetcode.com/problems/count-binary-substrings/) ### 题目描述 给定一个 0-1 字符串,求有多少非空子字符串的 0 和 1 数量相同,且 0 和 1 必须连续出现(比如 0011、1100;0101 不算)。 ### 输入输出样例 输入是一个字符串,输出一个整数,表示满足条件的子字符串的数量。 ``` Input: "00110011" Output: 6 ``` 在这个样例中,六个 0 和 1 数量相同的子字符串是 ["0011","01","1100","10","0011","01"]。 ### 题解 从左往右遍历数组,记录和当前位置数字相同且连续的长度,以及其之前连续的不同数字的长度。举例来说,对于 00110 的最后一位,我们记录的相同数字长度是 1,因为只有一个连续 0;我们记录的不同数字长度是 2,因为在 0 之前有两个连续的 1。若不同数字的连续长度大于等于当前数字的连续长度,则说明存在一个且只存在一个以当前数字结尾的满足条件的子字符串。 ```py def countBinarySubstrings(s: str) -> int: prev, cur, count = 0, 1, 0 for i in range(1, len(s)): if s[i] == s[i - 1]: cur += 1 else: prev = cur cur = 1 if prev >= cur: count += 1 return count ``` ## [1249. Minimum Remove to Make Valid Parentheses](https://leetcode.com/problems/minimum-remove-to-make-valid-parentheses/) ### 题目描述 给定一个包括字母和左右括号的字符串,求最少要移除多少个括号才能使其合法。 ### 输入输出样例 输入是一个字符串,输出是合法且长度最长的移除结果。 ``` Input: s = "lee(t(c)o)de)" Output: "lee(t(c)o)de" ``` 返回 lee(t(co)de) 或 lee(t(c)ode) 也算正确。 ### 题解 因为只有一种括号,所以我们并不一定利用栈来统计,可以直接用一个临时变量统计在当前位置时,左括号比右括号多出现多少次。如果在遍历过程中出现负数,则需要移除多余的右括号。如果遍历结束时临时变量为正数,则需要从右到左移除多余的左括号。这里我们使用了一个小技巧,先标记待删除位置,最后一起移除。 ```py def minRemoveToMakeValid(s: str) -> str: count, n = 0, len(s) to_delete = set() for i in range(n): if s[i] == "(": count += 1 elif s[i] == ")": if count > 0: count -= 1 else: to_delete.add(i) for i in range(n - 1, -1, -1): if count == 0: break if s[i] == "(": to_delete.add(i) count -= 1 return "".join(s[i] for i in range(n) if i not in to_delete) ```
嘉心糖糖
2025年3月11日 19:41
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码