【LeetCode】5# 最長回文子串
阿新 • • 發佈:2019-01-08
== clas ring math 復雜 stat println 關於 rom
題目描述
給定一個字符串 s
,找到 s
中最長的回文子串。你可以假設 s
的最大長度為 1000。
示例 1:
輸入: "babad"
輸出: "bab"
註意: "aba" 也是一個有效答案。
示例 2:
輸入: "cbbd"
輸出: "bb"
思路
本題運用了一些動態規劃的思想,關於動態規劃,可以看看我之前的一篇博客了解一下。
LeetCode 探索初級算法 - 動態規劃
1、首先要找到最簡情況。這道題中的最簡情況就是一個字母(比如“a”)和一對字母(比如”bb“)。
2、根據最簡情況向復雜拓展。更長的回文子串肯定是在簡單的情況下增長而來的,如何增長呢?就是在上一個回文子串的基礎上,左右各加一個同樣的字母。
3、針對一個中心,不斷向外拓展,直到遇到不是回文子串。
4、遍歷字符串,對每一個字符使用一遍拓展檢測,保存最長回文子串的長度,便於最後按索引取子串。
源碼
public class LongestPalindromicSubstring { public String longestPalindrome (String s) { if (s == null || s.length() == 0) return ""; int start = 0, end = 0; for (int i = 0; i < s.length(); i++) { int len1 = expandAroundCenter(s, i, i); // 一字母回文拓展 int len2 = expandAroundCenter(s, i, i + 1); // 二字母回文拓展 int len = Math.max(len1, len2); if (len > end - start) { start = i - (len - 1) / 2; end = i + len / 2; } } return s.substring(start, end + 1); } // 返回一個回文字串的長度 private int expandAroundCenter (String s, int l, int r) { while (l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) { l--; r++; } return r - l - 1; } public static void main (String[] args) { LongestPalindromicSubstring lps = new LongestPalindromicSubstring(); String s = "babad"; System.out.println(lps.longestPalindrome(s)); } }
心得體會
1、從暴力破解方法入手,找到優化方法
2、字符串方法substring()
的索引是左閉右開的
【LeetCode】5# 最長回文子串