数据结构与算法刷题之【字符串】篇
<p>汇总字符串相关的数据结构与算法刷题笔记,涵盖字符串反转、替换、KMP匹配等经典题型,结合剑指offer与力扣题目讲解双指针、哈希与字符串处理技巧及Java实现。</p>
<p>汇总字符串相关的数据结构与算法刷题笔记,涵盖字符串反转、替换、KMP匹配等经典题型,结合剑指offer与力扣题目讲解双指针、哈希与字符串处理技巧及Java实现。</p>
<p>汇总滑动窗口相关的数据结构与算法刷题笔记,讲解窗口扩张与收缩的通用模板,涵盖无重复字符的最长子串、最小覆盖子串等经典题型并给出Java实现与复杂度分析。</p>
<p>本文讲解 LeetCode 第 17 题「电话号码的字母组合」,将数字 2-9 映射为字母并求所有组合。使用递归回溯逐层枚举每组字母,并通过 StringBuilder 优化字符串拼接与撤销,给出完整 Java 代码与复杂度分析。</p>
<p>本文讲解 LeetCode 242 有效的字母异位词,判断两个字符串是否互为字母异位词。文章给出题目描述和调试代码,先分析会超时的暴力法,再重点介绍用长度为 26 的数组统计字符次数的哈希法,并给出多种 Java API 与 stream 的优化写法。</p>
<p>本文记录 LeetCode 383 赎金信的判断方法,要求赎金信字符串能由杂志字符串中的字符构成。文章给出题目描述与调试代码,利用仅含小写字母的特点,用长度 26 的数组统计杂志字符次数,再遍历赎金信逐个抵消完成校验。</p>
<p>本文讲解 LeetCode 344 反转字符串,要求在 O(1) 额外空间下原地反转字符数组。文章给出题目描述与调试代码,介绍使用左右双指针边交换边向中间靠拢的解法,并额外列举了临时变量、位运算、加减法三种字符交换写法。</p>
<p>本文记录 LeetCode 541 反转字符串 II 的解法,要求每 2k 个字符反转前 k 个,并正确处理末尾不足 k 个或不足 2k 个的情况。文章给出题目描述与调试代码,介绍按 2k 步长循环并封装 reverse 方法完成指定区间反转。</p>
<p>本文讲解剑指 Offer 05 替换空格,需把字符串中的每个空格替换成 %20。文章给出题目描述与调试代码,对比 O(n²) 的逐次移动填充,重点介绍先扩容再使用左右双指针从后往前填充的 O(n) 最优解法。</p>
<p>本文记录 LeetCode 151 翻转字符串里的单词,要求反转单词顺序并去掉多余空格。文章给出题目描述与调试代码,介绍 StringBuilder 拼接、纯字符数组从后往前填充,以及原地整体反转加二次反转移位的 O(1) 空间三种解法。</p>
<p>本文讲解剑指 Offer 58 左旋转字符串,需把字符串前 n 个字符转移到尾部。文章给出题目描述与调试代码,介绍整体反转后再分段反转的原地解法、新数组填充解法,并分析借助 substring 与 StringBuilder 效率更高的原因。</p>
<p>本文记录 LeetCode 28 实现 strStr() 的解法,要求在 haystack 中查找 needle 首次出现的下标。文章给出题目描述与调试代码,先分析会超时的暴力匹配,再重点讲解 KMP 算法构建 next 前缀表并进行最长前后缀匹配的 O(m+n) 过程。</p>
<p>本文讲解 LeetCode 459 重复的子字符串,判断字符串能否由其子串重复多次构成。文章给出题目描述与调试代码,介绍整除比较法、KMP 利用 next 数组末尾值判断、去重整除优化,以及拼接后去头去尾的巧妙两行解法。</p>
<p>本文讲解 LeetCode 20 有效的括号,判断只含括号的字符串是否合法闭合。文章给出题目描述与调试代码,介绍遇到左括号就压入对应右括号、遇到右括号再与栈顶匹配的栈解法,并说明栈为空或栈顶不匹配时直接判定失败。</p>
<p>本文记录 LeetCode 1047 删除字符串中的所有相邻重复项,反复删除相邻相同字母直到无法继续。文章给出题目描述与调试代码,介绍栈解法、以字符串充当栈的写法,以及在原字符数组上用快慢双指针覆盖的 O(1) 空间解法。</p>
<p>本文讲解 LeetCode 150 逆波兰表达式求值,根据后缀表达式计算整数结果。文章给出题目描述与调试代码,介绍遇到数字入栈、遇到运算符弹出两个数运算后再入栈的栈解法,并提醒减法和除法要区分操作数的先后顺序。</p>