Longest Substring Without Repeating Characters
一开始的思路是使用set记录出现过的字符串,当向set添加字符串时,如果set中已经存在则说明出现了重复字符串,则将set中的当前字母出现的位置更新(这块是存在问题的,因为重复字母前面的字母没有被删除,所以计算出的结果偏大。)
而本题考察的是双指针的问题。
Longset Palindromic Substring
一开始以第i个元素为中心,使用left和right指针分别向两边移动,直到满足条件为止就得到当前位置为中心时,最长的回文子串。遍历所有中心位置。
注:
1. 中心位置要注意,有以一个字母为中心的(奇数个字母),有一两个字母为中心的(偶数个字母)。
2. C++ 中的substr参数是起始位置,长度。
Palindrome Number
此题难度不大,就是不断从number取出前后两个数字进行比较,对于高位数字的取法有点技巧,比如,当前数是100,那么除数是100,如果是101,除数还是100。而右边的数就好计算了
Container with Most Water
还是使用双指针,分别指向前后,移动时注意是移动左指针,还是右指针。思想是如果左边的比右边的高度低,所以移动右指针只会更小,所以要移动左指针。
Three Sum
本题思路1:先计算两个数的和,再从数组中找另一个数。但这样非常麻烦,需要考虑两个数的重复性考虑,非常麻烦。
本题思路2:先确定target,再从数组中去寻找相等的和。使用方法简单,主要是只要在两端有重复的可以直接跳过;还有一个注意点是左边起始点是在target的右边。
3Sum Closest
本题的思路可以借助Tree Sum的思想,但其实相对来说更简单点。不用考虑重复的情况。
注:res的初始化有点意思,可以先任取三个数的结果为res**初始化**。
Next Permutation
本题考察的也是关于双指针的问题,题意理解清楚就好办了。
从后往前如果是一直增加,则需对总个数组反转;
如果不是,则需找到非增加的,与后面的最小的大于当前位置的数交换,再对交换以后的数反转
Group Anagrams
主要在于如何判断两个字符是不是anagram。方法是先对str排序,映射到map中
上述三题都有双指针的思想在里面。
Regular Expression Matching
此题是非常经典的一题。有动态规划和递归做法。递归属于暴力算法。思路基本是一样的。
思路:
1. 输入是text, pattern.
2. 比较过程中要先看pattern[j+1] == ‘*’
3. 对于pattern[j]==text[i],则是0/1/2….个重复的text[i]
4. 而pattern[j] != text[i],则是比较text[i] 与pattern[j+2]
5.对于pattern[j+1] !=’*’则简单了
注:判断pattern[j+1]==‘*’的写法要注意,其中要考虑pattern的长度,当就==pattern.size()-1时,则属于情况5了。
Rotate Image / Spiral Matrix
这两题很像,都是对矩阵逐层操作。
Rotate Image 相对来解说简单不少,矩阵形状很明确n*n。这题的方法很多,在Disscuss中有很多解法。最直观的操作还是对元素逐个旋转得到结果。关键在于替换元素和被替换元素下标的关系。
Spiral Matrix的矩阵形状不明确。一开始做时,以为可以通过一次循环处理所有情况。注意点在于:可旋转的层次书奇数,还是偶数。偶数可以直接在循环中解决,而奇数则需要将剩下的元素加入到结果中。