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兩種情況,然后從中心朝兩遍擴展,維護一個最大值,或者用動態(tài)規(guī)劃。用動態(tài)規(guī)劃的時候TLE,不過思想還是很值得去練習(xí)的,就是從對角線擴展的DP,先算對角線上的值,然后計算距離對角線為1的點的值,然后依次計算。當(dāng)計算對角線上方的值的時候,每一個值只和它的左下有關(guān)系,所以試著優(yōu)化為一維空間(并沒有解決,作為今天的重點關(guān)注點)。
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個字符,依次放入相應(yīng)的位置,然后再選擇下面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的題目,也可以用遞歸來做。