单词搜索

思路
- 是一个比较典型的dfs
- 每次搜寻路径的时候需要将已经走过的路径标记已走,但是结束这条路径搜索之后需要重新标为未走,否则后面开始搜寻的路径就没法通过这个格子
- 这个只需要能找到一条可行的路径,所以只要找到True的路径马上返回!
1 | class Solution: |
柱状图中最大的矩形

思路
- 是一个DP题
- 一个矩形的大小等于宽度*高度,在宽度固定的情况下,高度越高,面积越大
- 假设当前的立柱是最矮的立柱,创建两个列表l,r分别用来记录以当前立柱为高的矩形的左右坐标
- l列表从左往右遍历,如果当前柱i比i-1柱高,那么矩形的左坐标为i-1。如果当前柱比i-1柱矮,那么向左去找比i-1柱高的那根柱;
- r列表从右往左遍历,如果当前柱j不j+1高,那么矩形的右坐标为i+1,如果当前柱比i+1矮,向右去找比i+1高的那根柱;
- 为了防止无限循环,在原来的柱两边各加一根高度为-1的柱,作为出口
- 最终得到列表l和r,(l[i]-r[i]-1)*柱高 就能得到当前柱的矩形面积
代码
1 | class Solution: |
解码方法

思路
- 是一个加了限制的爬楼梯,也是DP问题
- 它的限制是这样:
- 如果当前字符是一个合法的个位数,dp[i]+=dp[i-1]
- 如果当前字符和前一个字符组成一个合法的十位数,dp[i]+=dp[i-2]
- 如果当前字符不合法,返回0
- 最后dp[-1]就是这个字符串的解
代码
1 | class Solution: |
加油站

思路
- 先判断cost是否小于gas,如果不是的话这个车一定跑不了全程
- 从头开始向后遍历,直到找到第一个gas>cost的加油站,从这里出发
- 如果当前的加油站不能支持跑完全程,那么当前加油站到达的最后一站开始向后查找gas>cost的加油站,因为从前面的任何一站出发都一定会在这站或这站之前停下。
代码
1 | class Solution: |
分割回文串

思路
- 是全排列
- 从左往右遍历,产生一个、两个、三个…n个字符连在一起的子串比如’aab’可以产生:
- a,a,b
- a,ab
- aa,b
- aab
- 如果这个子串是回文串,继续向后遍历,如果到达最后一个字符,把当前结果append进结果列表
代码
1 | class Solution: |
被围绕的区域
思路
- 一看就是bfs!我一看到dfs和bfs就头痛!
- 看了别人的高效简洁做法:
- 先把所有在边缘的O区域都找到,把他们标记出来,比如说把他们变成’P’
- 标记完了之后从头遍历,如果当前是X->跳过,如果是O->变成X,如果是P->变成O
1 | class Solution: |
晕了 bfs真的好长
单词接龙

思路
- 也是bfs!
- 引入一个defaultdict(list),对每个wordlist中的单词进行处理,比如令hot变成
*oth*tho*,以他们为键,将具有同样形式的单词加入他们的列表中 - 将beginword也做2中的处理,然后对它进行bfs
1 | class Solution: |
最长连续序列

思路
- 感觉似乎是个DP,不敢确定
- 引入defaultdict(int),以当前元素为键,值为当前元素所在序列的长度
- 如果当前元素-1或者+1也存在在dic中,更新当前键的值,并且更新这个序列左右边界的值
- 最后遍历defaultdict,输出最长的结果
代码
1 | class Solution: |