[LeetCode]--5. Longest Palindromic Substring

来源:互联网 发布:php邀请码生成算法 编辑:程序博客网 时间:2024/06/01 11:05

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.

我用的是中心扩展法
因为回文字符串是以中心轴对称的,所以如果我们从下标 i 出发,用2个指针向 i 的两边扩展判断是否相等,那么只需要对0到
n-1的下标都做此操作,就可以求出最长的回文子串。但需要注意的是,回文字符串有奇偶对称之分,即”abcba”与”abba”2种类型,
因此需要在代码编写时都做判断。
设函数int Palindromic ( string &s, int i ,int j) 是求由下标 i 和 j 向两边扩展的回文串的长度,那么对0至n-1的下标,调用2次此函数:
int lenOdd = Palindromic( str, i, i ) 和 int lenEven = Palindromic (str , i , j ),即可求得以i 下标为奇回文和偶回文的子串长度。
接下来以lenOdd和lenEven中的最大值与当前最大值max比较即可。
这个方法有一个好处是时间复杂度为O(n2),且不需要使用额外的空间。

public class Solution {    public String longestPalindrome(String s) {    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 left, int right) {    int L = left, R = right;    while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {        L--;        R++;    }    return R - L - 1;}}

还有一些动态规划啊啥的其他的几个方法,我也没去弄懂,有兴趣可以进这讨论区看看。
LeetCode官方讨论区

0 0
原创粉丝点击