LeetCode:5. Longest Palindromic Substring(找出一个字符串中最大的子回文串)

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

Example 1:

Input: "babad" Output: "bab" Note: "aba" is also a valid answer.

Example 2:

Input: "cbbd"
Output: "bb"

方法1:暴力算法,这种就没写出来,和前面的题目实现类似

方法2:这个方式不是暴力算法,但是也比较复杂

package leetcode;

import org.junit.Test;

/**
 * @author zhangyu
 * @version V1.0
 * @ClassName: LongestPalindromicSubstring
 * @Description: TOTO
 * @date 2018/12/6 19:12
 **/


public class LongestPalindromicSubstring2 {
    @Test
    public void fun() {
        String s = "aaab";
        String subString = longestPalindromicSubstring(s);
        System.out.println(subString);
    }

    private String longestPalindromicSubstring(String s) {
        StringBuilder s1 = new StringBuilder();
        StringBuilder s2 = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            s1 = s1.length() >= maxS(s, i, i).length() ? s1 : maxS(s, i, i);
            s2 = s2.length() >= maxS(s, i, i + 1).length() ? s2 : maxS(s, i, i + 1);
        }
        return s1.length() >= s2.length() ? s1.toString() : s2.toString();
    }

    private StringBuilder maxS(String s, int i, int j) {
        StringBuilder maxString = new StringBuilder();
        while (i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)) {
            StringBuilder sub = new StringBuilder(s.substring(i, j + 1));
            if (sub.length() > maxString.length()) {
                maxString = sub;
            }
            i--;
            j++;
        }
        return maxString;
    }
}

时间复杂度:O(n^2)

空间复杂度:O(n)


方法3:这个方式是在方法2中进行的优化(通过了leetcode编译器)

package leetcode;

import org.junit.Test;

/**
 * @author zhangyu
 * @version V1.0
 * @ClassName: LongestPalindromicSubstring
 * @Description: TOTO
 * @date 2018/12/6 20:18
 **/


public class LongestPalindromicSubstring3 {
    @Test
    public void fun() {
        String s = "babad";
        String subString = longestPalindromicSubstring(s);
        System.out.println(subString);
    }

    private static String longestPalindromicSubstring(String s) {
        // 当字符串的长度小于或者等于1时候直接返回
        if(s.length()<=1){
            return s;
        }
        String s1 = "";
        String s2 = "";
        for (int i = 0; i < s.length()-1; i++) {
            s1 = s1.length() >= maxS(s, i, i).length() ? s1 : maxS(s, i, i);
            s2 = s2.length() >= maxS(s, i, i + 1).length() ? s2 : maxS(s, i, i + 1);
        }
        return s1.length() >= s2.length() ? s1 : s2;
    }

    private static String maxS(String s, int i, int j) {
        String maxString = "";
        while (i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)) {
           /* String sub = s.substring(i, j + 1);
            if (sub.length() > maxString.length()) {
                maxString = sub;
            }*/
            i--;
            j++;
        }

        //System.out.println(i + "--" + j);
        //System.out.println(s.substring(i, j));
        //因为i和j都减一了,所以都要加1
        return s.substring(i+1,j);
    }
}

时间复杂度:O(n^2)

空间复杂度:O(n)

猜你喜欢

转载自blog.csdn.net/zy345293721/article/details/84870880