暴力求解最大回文子串,優化暴力解,使用動態規劃求解

2021-10-23 18:17:41 字數 1455 閱讀 3307

求解最大回文子串是一道比較常見的演算法題,回文就是正著讀和反著讀是一樣的,例如:上海自來水來自海上。

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 中的所...