| 题目 | 思路 | 备注 |
|---|---|---|
| 反转字符串 | 左右夹逼双指针 | |
| 整数翻转 | 取模、整除 | |
| 字符串中的第一个唯一字符 | 1. indexOf == lastIndexOf 1. 频率哈希表 |
|
| 有效的字母异位词 | 频率哈希表 | |
| 字母异位词分组 | 为每个词生成一个key,然后按key分级即可 | 生成key的方式:将字符串的字符数组排序,然后生成一个新串作为key |
| 验证回文串 | 左右夹逼双指针 | |
| 字符串转换整数 | 直接转换 or 自动机 | |
| 实现 indexOf() | KMP算法: 不相等就不断查next数组![]() |
求next数组: 初始化、处理不等前缀、处理相等前缀、赋值![]() |
| 实验strStr() | ||
| 外观数列 | 直接遍历生成,放入StringBuilder | 外观数量,后面数是对前面数字的描述:21 -> 1211(1个2及1个1) |
| 最长公共前缀 | 挨个比较字符,直到不相等时就返回 | |
| 无重复字符的最长子串 | 滑动窗口+哈希表,Map中记每个字符的索引位置。 当重复字符出现时,更新滑窗起始位置和最大长度 |
if (map.containsKey(ch)) start = max(map.get(ch)+1, start); max = Math.max(max,end - start + 1); |
| 最长回文子串 | 动规:dp[i][j]表示下标从i到j的子串是否是回文串, i<=j dp[i][j] = dp[i+1][j-1] && s[i]==s[j] |
注意,要用两次循环:j∈[0, n-1], i∈[0, j-1] dp[i][j] = (j - i < 3 || dp[i + 1][j - 1]) && s[i]==s[j]; //si==sj时1-2位字符一定是回文 |
| 回文子串 | 跟上边一样的动规思路 | ![]() |
| 重复的子字符串 | 构造双倍串,然后看去掉首尾字符后是否仍包含原串 | 一句代码:return (s + s).indexOf(s, 1) != s.length(); |
| 最小覆盖子串 | 滑动窗口, 维护两个字符频率表,一个表示子串的字符频率表,一个是当前窗口的字符频率表。 - 每当右指针向右滑动,就根据这两个状态表检查当前窗口是否包含子串: - 如果窗口包含子串,更新最优结果指针,并则尝试将左指针向右压缩 - 如果窗口不包含子串,则继续向右滑动右指针 - 最后根据最优结果指针返回对应的子串即可 |
![]() |
| 字符串相加 | 模拟数据中的竖式加法,从末位依次相加即可。 最后对整体结果串reverse一下 |




