1. 程式人生 > >【LeetCode】5# 最長迴文子串

【LeetCode】5# 最長迴文子串

題目描述

給定一個字串 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()的索引是左閉右開的