一切演算法理論都是為了解決實際問題,直接講解演算法理論很難理解, 我們結合實際問題來深刻理解動態規劃的奇妙。
題目:給定乙個字串s
,找到s
中最長的回文子串。你可以假設s
的最大長度為 1000。
示例1:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是乙個有效答案。
示例2:
輸入: "cbbd"
輸出: "bb"
解題思路:本題最容易想到的一種方法應該就是中心擴散法。
中心擴散法怎麼去找回文串?
從每乙個位置出發,向兩邊擴散即可。遇到不是回文的時候結束。舉個例子,str = acdbbdaastr=acdbbdaa 我們需要尋找從第乙個 b(位置為 33)出發最長回文串為多少。怎麼尋找?
首先往左尋找與當期位置相同的字元,直到遇到不相等為止。
然後往右尋找與當期位置相同的字元,直到遇到不相等為止。
最後左右雙向擴散,直到左和右不相等。如下圖所示:
每個位置向兩邊擴散都會出現乙個視窗大小(len)。如果 len>maxlen(用來表示最長回文串的長度)。則更新 maxlen 的值。
因為我們最後要返回的是具體子串,而不是長度,因此,還需要記錄一下 maxlen 時的起始位置(maxstart),即此時還要 maxstart=len。
public string longestpalindrome1(string s)
int strlen = s.length();
int left = 0;
int right = 0;
int len = 1;
int maxstart = 0;
int maxlen = 0;
for (int i = 0; i < strlen; i++)
while (right < strlen && s.charat(right) == s.charat(i))
while (left >= 0 && right < strlen && s.charat(right) == s.charat(left))
if (len > maxlen)
len = 1;
}return s.substring(maxstart + 1, maxstart + maxlen + 1);
}
優化:
中心擴散的方法,其實做了很多重複計算。動態規劃就是為了減少重複計算的問題。動態規劃聽起來很高大上。其實說白了就是空間換時間,將計算結果暫存起來,避免重複計算。作用和工程中用 redis 做快取有異曲同工之妙。
我們用乙個 boolean dp[l][r] 表示字串從 i 到 j 這段是否為回文。試想如果 dp[l][r]=true,我們要判斷 dp[l-1][r+1] 是否為回文。只需要判斷字串在(l-1)和(r+1)兩個位置是否為相同的字元,是不是減少了很多重複計算。
進入正題,動態規劃關鍵是找到初始狀態和狀態轉移方程。
初始狀態,l=r 時,此時 dp[l][r]=true。
狀態轉移方程,dp[l][r]=true 並且(l-1)和(r+1)兩個位置為相同的字元,此時 dp[l-1][r+1]=true。
public string longestpalindrome(string s)
int strlen = s.length();
int maxstart = 0; //最長回文串的起點
int maxend = 0; //最長回文串的終點
int maxlen = 1; //最長回文串的長度
boolean dp = new boolean[strlen][strlen];
for (int r = 1; r < strlen; r++) }}
}return s.substring(maxstart, maxend + 1);
}
動態規劃演算法(二)
繼續以例題如入手,不是解題,而是學習動態規劃 題目描述 給定乙個非空字串 s 和乙個包含非空單詞列表的字典 worddict,判定 s 是否可以被空格拆分為乙個或多個在字典 現的單詞。說明 拆分時可以重複使用字典中的單詞。你可以假設字典中沒有重複的單詞。示例 1 輸入 s leetcode word...
演算法 動態規劃
動態規劃 把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解 演算法例子 1.鋼條切割 serling 公司購買長鋼條,將其切割為短鋼條,切割工序假設沒有成本支出,公司管理層希望確定最佳的切割方案。假設serling公司 一段長度為i英吋的鋼條的 為pi。鋼條的長度為整英吋,下表給出...
演算法 動態規劃
1 問題具有最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質。比如說在揹包問題中,最高總價值 max 選擇不放該物品時達到的總價值,決定放該物品時揹包剩餘容量能達到的最大價值 該物品價值 顯然,最高總價值的解一定包含 選擇不放該物品時達到的總價值 和 決...