求解最大回文子串是一道比較常見的演算法題,回文就是正著讀和反著讀是一樣的,例如:上海自來水來自海上。
1.暴力求解
擷取每個可能的字元子串,並判斷該字串是否回文,先寫乙個判斷回文的小函式:
public
static
boolean
ispalindromic
(string s)
}return
true
;}
使用兩次迴圈,截取出所有可能出現的子串,依次判斷是否回文:
public
static string solution
(string s)}}
return ret;
}
第一次在leetcode提交時,還提示超時,其實暴力求解可以優化下的,既然是求最大回文(不是所有回文子串),內層迴圈時可以直接在已知解的基礎上擷取,如果沒有滿足的長度直接結束。
for
(int i =
0; i < len; i++
)}
程式不正是優化而來的嗎?
2.動態規劃
動態規劃在我理解就是在求解過程中,後面的求解過程可以使用前面已經求解完成的解,這樣可以避免重複的運算,個人感覺和尾遞迴的路子一樣。這裡的解依舊是優化暴力求解。
使用二維陣列記錄字串dp[i] [j] 來記錄字串下標 i 到 j 的子串是否為回文,顯然單個字元是回文,且存在:如果s[i]==s[j],且s[i+1]==s[j-1],那麼dp[i] [j] 是回文。
基於以上,存在:
dp[i] [i] = true;
s[i] == s[j] ,j - i = 1 || j - i = 2時,dp[i] [j] = true;
s[i]==s[j],s[i+1]==s[j-1]時, dp[i] [j] = true;
public string longestpalindrome
(string s)
boolean dp[
]=newboolean
[s.length()
][s.
length()
];for(
int i =
0; i < s.
length()
; i++
)int pos =0;
int len =1;
for(
int i =
1; i < s.
length()
; i++)}
else}}
return s.
substring
(pos, pos + len)
;}
這樣我們標記了下標 i 到 j 的字元子串是否為回文,繼續向前求解時就可以利用這些已知的解,作為判斷當前求解過程的依據。 暴力求解之最大乘積
參考 書籍 劉汝佳 演算法競賽入門 給乙個數字集合,請從這個數字集合裡找出一段連續數字,使他們的乘積是最大的。樣例輸入 3 2 4 3 5 2 5 1 2 1 3 9 7 8 2 1 1 1 9 1 n 18,10 si 10.連續的子串行有兩個要素,即起點和終點 因此只需列舉起點和終點即可,由於至...
最長回文子串(暴力法)
求最長回文子串最簡單最暴力的方法就是遍歷每乙個子串,看看這個子串是不是回文,是的話這個子串的長度有沒有最大的長度max大,遍歷每乙個子串的時間複雜度是o n 2 判斷乙個子串是不是回文子串的時間複雜度是o n 這三個for迴圈巢狀在一起所以時間複雜度為o n 3 include include in...
每日一題 暴力求解 最大點集合
問題描述 p為給定的二維平面整數點集。定義 p 中某點x,如果x滿足 p 中任意點都不在 x 的右上方區域內 橫縱座標都大於x 則稱其為 最大的 求出所有 最大的 點的集合。所有點的橫座標和縱座標都不重複,座標軸範圍在 0,1e9 內 如下圖 實心點為滿足條件的點的集合。請實現 找到集合 p 中的所...