LeetCode:Longest Palindromic Substring

来源:互联网 发布:mac flash player 编辑:程序博客网 时间:2024/04/26 18:42

题目描述:Longest Palindromic Substring

  Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

思路一:

  中心扩展法:就是把给定的字符串的每一个字母当做中心,向两边扩展,这样来找最长的子回文串。算法复杂度为O(N^2)。

  但是要考虑两种情况:1、像aba,这样长度为奇数。2、像abba,这样长度为偶数。

class Solution {    public String longestPalindrome(String s) {        int len = s.length();        if (s == null || len <= 1)            return s;        int start = 0;        int longestLen = 0;        // 当回文串的长度为奇数时        for (int i = 1; i < s.length(); i++) {            int j = i - 1, k = i + 1;            while (j >= 0 && k < s.length() && s.charAt(j) == s.charAt(k)) {                if (longestLen < k - j + 1) {                    longestLen = k - j + 1;                    start = j;// 记录下最长子回文串的起始点                }                j--;                k++;            }        }        // 当回文串的长度为偶数时        for (int i = 0; i < s.length(); i++) {            int j = i, k = i + 1;            while (j >= 0 && k < s.length() && s.charAt(j) == s.charAt(k)) {                if (longestLen < k - j + 1) {                    longestLen = k - j + 1;                    start = j;// 记录下最长子回文串的起始点                }                j--;                k++;            }        }        if (start == 0 && longestLen == 0)            return s.charAt(0) + "";        return s.substring(start, start + longestLen);    }}

思路二:

DP 思路:

P[i][j]是记录i到j子串是不是回文串

P(i,j)={true,if the substring Si…Sj is a palindrome;false,if the substring Si…Sj is not a palindrome}

那么可以得到:P(i,j)=(P(i+1,j−1) && Si==Sj)

代码:

时间复杂度O(n^2),空间复杂度O(n^2)

class Solution {    public String longestPalindrome(String s) {        int len = s.length();        if (s == null || len < 2)            return s;        boolean[][] dp = new boolean[len][len];        int left = 0, right = 0, maxLen = 0;        for (int j = 0; j < len; j++) {            for (int i = 0; i < j; i++) {                // 如果s[i] == s[j] 回文性质由 s[i+1][j-1] 决定                if (s.charAt(i) == s.charAt(j)                        && (j - i <= 2 || dp[i + 1][j - 1])) {                    dp[i][j] = true;                    if (j - i + 1 > maxLen) {                        maxLen = j - i + 1;                        left = i;                        right = j;                    }                }            }        }        if (left == right)//如果没有回文串,输出第一个字符            return s.charAt(0) + "";        return s.substring(left, right + 1);    }}

思路三:

这里写代码片

—–乐于分享,共同进步
—–Any comments greatly appreciated

0 0
原创粉丝点击