题目 思路 备注
    反转字符串 左右夹逼双指针
    整数翻转 取模、整除
    字符串中的第一个唯一字符
    1. indexOf == lastIndexOf
    1. 频率哈希表
    有效的字母异位词 频率哈希表
    字母异位词分组 为每个词生成一个key,然后按key分级即可 生成key的方式:将字符串的字符数组排序,然后生成一个新串作为key
    验证回文串 左右夹逼双指针
    字符串转换整数 直接转换 or 自动机
    实现 indexOf() KMP算法: 不相等就不断查next数组
    image.png
    求next数组: 初始化、处理不等前缀、处理相等前缀、赋值
    image.png
    实验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位字符一定是回文
    回文子串 跟上边一样的动规思路 image.png
    重复的子字符串 构造双倍串,然后看去掉首尾字符后是否仍包含原串 一句代码:return (s + s).indexOf(s, 1) != s.length();
    最小覆盖子串 滑动窗口, 维护两个字符频率表,一个表示子串的字符频率表,一个是当前窗口的字符频率表。
    - 每当右指针向右滑动,就根据这两个状态表检查当前窗口是否包含子串:
    - 如果窗口包含子串,更新最优结果指针,并则尝试将左指针向右压缩
    - 如果窗口不包含子串,则继续向右滑动右指针
    - 最后根据最优结果指针返回对应的子串即可
    image.png
    字符串相加 模拟数据中的竖式加法,从末位依次相加即可。 最后对整体结果串reverse一下