力扣5 最長回文子串(DP)

2021-10-18 03:35:00 字數 1482 閱讀 8444

服了,一道dp寫一天,寫出來的**還巨爛

dp思路:

正序串和逆序串找最長公共子串,注意需另外判斷子串是否為回文串,比如"abchkcba",這個很坑。

dp陣列記錄正序串在i之前,逆序串在j之前的最長公共子串長度,公共子串以 [i][j] 處的char作為結束的,所以當 chararr[i] != adverse[j] 時,最長公共子串長度直接為0。

dp時,if(chararr[i] == adverse[j])    dp[i][j] = dp[i-1][j-1] + 1;else不做處理。else這裡一開始做錯了,瞎搞,原因是不理解第2點寫的dp思路。

guide陣列記錄正序串在i之前的最長公共子串長度,只有dp[i][j]比原guide[i]大時才需替換,最後記錄的是正序串在i之前和逆序串的全部的最長公共子串長度(公共子串是帶 i 的,所以取公共子串時直接從 i 向前取就行了)。

字串逆轉時可以用 string reverse = new stringbuffer(s).reverse().tostring();

//由例項4可知,應假定chararr為列,adverse為行

//初始化第一行

for (int i = 0; i < adverse.length; i++)

else

dp[0][i] = 0;

}//初始化第一列

for (int i = 0; i < adverse.length; i++)

for (int i = 1; i < s.length(); i++)

// else

// dp[i][j] = math.max(dp[i-1][j], dp[i][j-1]);}}

system.out.println();system.out.println();

// for (int i = 0; i < s.length(); i++)

// }

system.out.println();

int max = 0;

for (int i = 0; i < guide.length; i++)

system.out.println();

system.out.println(max);

return s.substring(max+1-guide[max], max+1);

}public boolean ishuiwen(string s)

}

最長回文子串 力扣5

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 利用回文字串的特點 正著讀和反著讀都是一樣的,所以首先把s反轉,利用i和j控制左右邊界,不斷從s中擷取...

力扣 5 最長回文子串

題目 和647類似 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 題解 方法一 面試題,要求最長只能一趟迴圈 中心擴散法 class solutio...

力扣題庫 5 最長回文子串

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 從中心向兩端尋找,最終得到最大的字串 找單數最大,如為回文,則長度為 2 itmp 1 itmp so...