美文网首页
leetcode5---Longest Palindromic

leetcode5---Longest Palindromic

作者: lemooon | 来源:发表于2017-10-03 10:06 被阅读0次

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:

Input: "babad"

Output: "bab"

Note: "aba" is also a valid answer.
Example:

Input: "cbbd"

Output: "bb"
题目分析:返回一个字符串的最长回文子串。首先明确一下回文串的概念。一个回文串也就是一个字符串,它从正着读和反着读都是一样的。例如"aba"就是一个回文串,"abba"也是回文串,而"abc"则不是。
本题最简单的想法就是设置两个指针i,j,然后依次判断i,j位置之中的字符串是否为回文串,这种方法的时间复杂度为0(n^2),且有大量的不必要判断。
我们还是考虑一次遍历的情况,设置一个指针i,来寻找从i位置往两边扩展能扩的最大回文子串长度,一次遍历下来就可以得到答案。但是这时候有个问题,回文串有可能是奇串也有可能是偶串,如果我们分奇偶来考虑则会很麻烦。能否将两种情况合并成一种呢?我们定义函数findLongestPalidrome(String s, int i, int j),其中i,j为开始搜索时的起始位置,那么如果为奇数的情况下令i=j问题就引刃而解了,而偶数情况下我们令j=i+1,查找de终止条件为i,j越界或者s.charAt(i)!=s.charAt(j)。此时我们可以得到最长的回文子串的开始位置和结束位置,用两个变量记录下来。然后每一次循环之后进行比较即可。这种情况的复杂度仍为O(n^2),但是中间的判断步骤会少很多。可以近似达到O(n)。

int start = 0;
    int len = 1;

    public String longestPalindrome(String s) {
        if (s == null)
            return null;
        if (s.length() == 1)
            return s;
        for (int i = 0; i < s.length(); i++) {
            findLongestPalidrome(s, i, i);
            findLongestPalidrome(s, i, i + 1);
        }
        return s.substring(start, start + len);     
    }

    private void findLongestPalidrome(String s, int i, int j) {
        while (i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)) {
            i--;
            j++;
        }
        if (j - i - 1 > len) {          //易错,容易写成j-i+1
            len = j - i - 1;        
            start = i + 1;
        }
    }

相关文章

网友评论

      本文标题:leetcode5---Longest Palindromic

      本文链接:https://www.haomeiwen.com/subject/brbtyxtx.html