6.27 - medium總結(jié)1

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的題目,也可以用遞歸來做。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容