记了点自己有问题的题目
LeetCode题
Word Break II
给一个str s和一个str[] dict,输出所有s可能被dict拼接的组合。例如
s = "catsanddog"
, dict = ["cat", "cats", "and", "sand", "dog"]
.
A solution is ["cats and dog", "cat sand dog"]
.
一开始我的想法是用DFS维护一个栈,再用Trie优化字符串检索。可惜这种方式会超时。看了别人的代码,就感觉自己宛如一个智障。
1 | 用刀在字符串中切一刀。左边是i个字符,右边是len-i个字符。 |
Palindrome Partitioning
给一个str,输出它所有的可能的回文子串。
For example, given s = "aab"
,Return
1 | [ |
这道题我借鉴了上一题的解法,
1 | 用刀在字符串中切一刀。左边是i个字符,右边是len-i个字符。 |
Minesweeper
扫雷题
1 | E : 没打开的地方 |
规则:
- 点击某点,如果此点为雷,那么将此点设为X,游戏结束
- 否则,自动探测周围的8个点,如果某点周围没有雷,则继续深入探测;如果某点周围有雷,则标记雷个数
1 | int[] dx = {1, 1,1, 0,0,-1,-1,-1}; |
Remove Invalid Parentheses
删除尽量少的括号,使得一个字符串的括号符合要求
实在是没思路,到现在也没做上。先记一下套路吧
方法1,DFS
1 | public List<String> removeInvalidParentheses(String s){ |
方法2,套路
1 | private void remove(String s, List<String> ans, int last_i, int last_j, char[] pair){ |
Decode String
给一个字符串3[a]2[bc]
。数字表示后面括号里的字符重复次数。求解压之后的字符串。
这道题第一遍没想明白,第二遍重写的时候才一气呵成。其实就是dfs,当遇到数字时,就将数字后面的东西视为一个新的str,递归下去,遇到]
就跳出。跳出时需要携带跳出时的结束idx,因此我用了一个Node包装起来
1 | 以3[a2[c]]为例 |
其实再思考了一下,idx完全可以设为全局变量!
1 | private boolean isLetter(char c){ |
Pacific Atlantic Water Flow
给一个矩阵。左和上是太平洋,右和下是大西洋。求中间哪些点的水可以同时流到两个洋
思路:反向思考。从边界出发,寻找递增的方向。所有递增的都是能流到的。
1 | private void setVisited(int[][] matrix,int i, int j, int val ){ |
消除游戏集锦
Strange Printer
有一种打印方式,每轮只打印元素相同的字符串,打印时还会覆盖原来的字符串。给一个字符串,求打印这个字符串所需要最少的轮数。
我好像理解错题意了。看完了答案,想哭。回头再战。
Zuma Game
直到三刷才做出来的题。
给两个字符串,字符串board表示现在的球,hand表示手里拿的球。可以把手里的某个颜色球插入到board,使得插入位置相邻的有3个或以上的球颜色一样,就会消除颜色一样的球。
求能消除所有球时,插入的最小次数。
1 | HashMap<Character, Integer> hand_hash; |
Remove Boxes leetcode
其它递归相关
Lexicographical Numbers
将[1,n]之间的数字按照字典顺序加入到一个list里
我的思路:递归
1 | int n; |
别人的较快的方案:
1 | public List<Integer> lexicalOrder(int n) { |