2. Add Two Numbers: 注意维护一个carry
3. Longest Substring Without Repeating Characters: dynamic window,维护一个hash,char -> index,然后不停的更新两个边界(先更新右边界限如果newchar在hash里,然后增加左边界,直到相同的char的下一位)
5. Longest Palindromic Substring: 可以用暴力的方法,对于每一个字符,left=right=i和left=right-1=i两种情况,然后从中心朝两遍扩展,维护一个最大值,或者用动态规划。用动态规划的时候TLE,不过思想还是很值得去练习的,就是从对角线扩展的DP,先算对角线上的值,然后计算距离对角线为1的点的值,然后依次计算。当计算对角线上方的值的时候,每一个值只和它的左下有关系,所以试着优化为一维空间(并没有解决,作为今天的重点关注点)。
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
if not s:
return ""
dp = [[0 for _ in range(len(s))] for _ in range(len(s))]
res = ""
max_l = 0
k = 0
while k < len(s):
for i in range(len(s)):
if i + k < len(s):
j = i + k
if s[i] == s[j]:
if k == 0:
dp[i][j] = 1
elif k == 1:
dp[i][j] = 2
else:
dp[i][j] = dp[i+1][j-1] + 2
if dp[i][j] > max_l:
res = s[i:j+1]
max_l = dp[i][j]
k += 1
return res
6. ZigZag Conversion: 先划分总长度比如说高度为6,那么一个分段长度就是6+6-2 = 10, 每次选择10个字符,依次放入相应的位置,然后再选择下面10个字符
8. String to Integer (atoi): 主要要把情况考虑全了,比如说两边的空格,开始的sign字符等等
11. Container With Most Water: 从两边向中央依次选择高一点的抛弃矮的那一边
12. Integer to Roman: 从最大的值开始mod,有几个就是append几个
15. 3Sum: 先sort,然后依次以每一个值作为target然后做two sum
16. 3Sum Closest: 和上一题一样,只是维护一个最小distance
17. Letter Combinations of a Phone Number: 简单的backtracking的题目,也可以用递归来做。