[leetbook中級演算法-陣列和字串(java解法)]LC最長迴文子串
阿新 • • 發佈:2021-01-24
技術標籤:演算法練習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);
}
}