1. 程式人生 > 其它 >[leetbook中級演算法-陣列和字串(java解法)]LC最長迴文子串

[leetbook中級演算法-陣列和字串(java解法)]LC最長迴文子串

技術標籤:演算法練習leetbook字串演算法leetcode動態規劃

leetbook:中級演算法

型別:陣列和字串

題目名:最長迴文子串

原題URL:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xvn3ke/

題目描述

給你一個字串 s,找到 s 中最長的迴文子串。

示例

示例 1:

輸入:s = "babad"
輸出:"bab"
解釋:"aba" 同樣是符合題意的答案。

示例 2:

輸入:s = "cbbd"
輸出:"bb"

示例 3:

輸入:s = "ac"
輸出:"a"

限制

  • 1 <= s.length <= 1000
  • s 僅由數字和英文字母(大寫和/或小寫)組成

解題思路

1.動態規劃,思路是如果當前字元,和遍歷到的字元相等,並且中間的字串是迴文字串,那麼這個字元就是迴文字串

2.所以用這個boolean二維陣列來儲存str[ i ] [ j ]這個字串是不是迴文字元

3.動態規劃二層迴圈解決

解題程式碼

class Solution {
    public String longestPalindrome(String s) {
        char[] chars =
s.toCharArray(); //標記第i~j個位置的字串是不是迴文字元 boolean[][] lens = new boolean[chars.length][chars.length]; //初始化 for(int i =0;i<chars.length;i++) { lens[i][i] = true; } int max = 0; int st = 0; int ed = 0; for(int end = 1;end<
chars.length;end++) { for(int start = 0;start<end;start++) { if(chars[start]==chars[end]) { if(start+1==end||lens[start+1][end-1]){ lens[start][end]=true; if(end-start+1>max) { max = end-start+1; st = start; ed = end; } } } } } return s.substring(st,ed+1); } }