摘要: 字符串匹配,由于*可以匹配任意的一串字符,必须遍历所有可能的匹配情况,所以这里用迭代比递归要更好一点,遇到*之后,假定*匹配0个字符,一直到匹配整个s字符,遍历判断是否可以匹配成功;用指针prep记录*后面一个非*字符,用pres来记录遍历的起始点; 1 class Solution { 2 public: 3 bool isMatch(const char *s, const char *p) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() funct... 阅读全文
posted @ 2013-09-19 15:21 Exio 阅读(335) 评论(0) 推荐(0) 编辑
摘要: 经典的N皇后问题,这里学到了一个非常牛的新方法(http://www.matrix67.com/blog/archives/266),用位运算来求解N皇后问题;思路其实也很容易懂,一点都不复杂,同样是遍历每一行的每一列,只不过所有冲突的位置都用bit位置记录下来了,首先考虑在第k行的第j列放一个皇后,那么第k + 1行的第j - 1列和 j +1列都会与该皇后冲突,用位运算的左右移位就能表示所有列的有冲突的位置,那么在选择第k + 1行的放置位置的时候就只能选择无冲突的位置。 1 class Solution { 2 public: 3 int totalNQueens(int n) ... 阅读全文
posted @ 2013-09-12 12:36 Exio 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 斐波那契数列; 1 class Solution { 2 public: 3 int climbStairs(int n) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 if (n fb(n + 1, 1);10 fb[2] = 2;11 for (int i = 3; i <= n; ++i) {12 fb[i] = fb[i - 1] + fb[i - ... 阅读全文
posted @ 2013-09-11 15:18 Exio 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 很简单的dfs; 1 class Solution { 2 public: 3 bool exist(vector > &board, string word) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 if (word.empty()) { 7 return true; 8 } 9 if (board.empty()) {10 r... 阅读全文
posted @ 2013-09-11 15:09 Exio 阅读(542) 评论(0) 推荐(0) 编辑
摘要: 中等难度的题目,可是还是想不出来,哎,这种题目应该属于必须做对的题目,没有什么特别的考虑,只是给你设置了一个障碍,需要你想办法翻越这个障碍,看了提示用两个指针,还是没做出来;主要这种做法完全没有一点印象和灵感,还是锻炼和接触的太少了;解法很简洁,只需要递进地移动开始指针就可以了,其实关键在于设计移动的策略和条件;我发现其实一般简洁的解法当中都加入了一些对人来说显而易见的重复,我之前的想法一直是在考虑移动起始点,然后再去判断是否可以满足包含的条件,这样就会很难处理,需要记录的各种条件就会比较多;最后才发现其实保存前面已经满足条件的状态不变就行了,遇到新的元素之后,只需要判断它是否可以取代前面的元 阅读全文
posted @ 2013-09-11 02:06 Exio 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 看起来很简单,实际上超级难的题目呀,开始怎么想都只能想到O(n^2)的方法,后来看了一下提示这道题是用栈,思考了一下写了一个,基本思路算是理解了,不过关键在于遇到一个小于栈顶的数时,在不断弹出栈中比该元素大的数的时候要记住弹出元素的个数,所以我写的是用两个值来表示栈中的一个元素,一个是高度,另一个是个数,可是这样还有一个问题:每次更新的时候只更新了左边比它大的元素的个数,当后面再有元素弹出时,这时它右边的这些弹出了的元素的长度就没有被计算,所以关键问题在于怎么记录一个元素左右比它大的元素的数目,即它的最大长度,哎,始终想不到比较高效的方式,如果直接给每个元素一个值来记录的话,这样每次都需要遍历 阅读全文
posted @ 2013-09-11 00:09 Exio 阅读(285) 评论(0) 推荐(0) 编辑
摘要: 哎,难题又不会做,思路没有什么难度,关键是要把问题思考透彻,要考虑的要点还是挺多的,不容易一下子都考虑到;我开始的思路是按照树的根去递归的,这样就必须要没有重复元素,因为需要每次在s2中查找s1中的元素;怎么说呢,有点考虑的过于specific了,其实直接把字符串分成两部分递归就可以了,不过需要注意不能漏掉两部分可能次序调换的情况。 1 class Solution { 2 public: 3 bool isScramble(string s1, string s2) { 4 // Start typing your C/C++ solution below 5 ... 阅读全文
posted @ 2013-09-10 21:59 Exio 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 看懂题目后非常简单,找到规律就比较好写了,如果已经有最低k位的格雷码了的话,只需要把k+1位变成1,然后和前面k位的格雷码组合在一起就行了,这时候前k位格雷码的顺利要倒过来; 1 class Solution { 2 public: 3 vector grayCode(int n) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 vector res; 7 if (n &res, int k, in... 阅读全文
posted @ 2013-09-10 10:03 Exio 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 哎,写代码太不专注了,还是头脑和注意力不够集中,需要多在脑子里面磨练,另外写程序的思维方式还比较土,总喜欢单独考虑很多特殊情况,导致代码看起来很繁琐,需要多看别人的代码好好学习如何写得简洁短小; 1 class Solution { 2 public: 3 vector restoreIpAddresses(string s) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 vector res; 7 ... 阅读全文
posted @ 2013-09-10 09:59 Exio 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 同上一道返回bst树的题目的思路,求数目的话更加简单; 1 class Solution { 2 public: 3 int numTrees(int n) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 if (n <= 0) { 7 return 0; 8 } 9 int count = 0;10 getNum(count, 1, n + 1... 阅读全文
posted @ 2013-09-09 22:54 Exio 阅读(180) 评论(0) 推荐(0) 编辑