总结:
String 类题型:
通用模板: 设一个HashMap/int[] count = new int[256]. 然后双指针。
while(right < str.length()) 处理。经常会设计到Sliding Window原理。
Permutation, Swapping: Greedy 解法。通过比较leftMost 和 rightMost bit 哪个大然后看需要调换位置不。
Range_Sum, 区间子和 类题型:
用HashMap, 或者array存储0---i 子问题的sum. 然后 arr[j] -arr[i] =中间范围的sum。
【 累加和两种套路:】
1. 如果是求存在不存在的,很有可能要map.put(0, -1)
2. 如果是求长度的,不需要
括号类问题: 大部分情况下用Stack,偶尔用DP. 不过一般Stack都能解决。
List类问题:一般会设置一个Fake Node. 然后用Cur Node遍历。 主要考研的是edge case.
Palindrome 回文类题目: 双指针遍历center,然后两边扩散。
扫描线问题: 设置一个class Node. 然后遍历。用一个Stack 或者PriorityQueue之类的。
BST 问题: 一般几种处理方式: 1. 递归traversal.
图类问题: Union Find, 或者 建Graph + visited set + DFS 或者 Topological Sort -> Build Graph + Topological + DFS。 一般Graph的搭建其实就是建一个HashMap<..> 或者ArrayList. 就是有一个Key,和一个list of 这个Vertex能去的地方。
Union Find遍历Graph adj List的时候是double for Loop,
Compiler 类问题: 基本都是Stack. 偶尔 Regular Expression.
DP记忆化搜索:Boob Enemy, Longest increasing Path.
随机数类问题:Random pick index, Shuffle[假设前n-1 已经random了,第n个可以随机放在n个位置]