【算法】最长回文子串

题目

        回文串(palindromic string)是指这个字符串无论从左读还是从右读,所读的顺序是一样的。简而言之,回文串是左右对称的。所谓最长回文子串问题,是指对于一个给定的母串。从所有的为回文串的子串a, ded, cdedc, bcdecdb中;找出最长的那一个bcdecdb。但是该如何判断子串是否回文然后找出最长者呢?

解答

一、暴力求解(时间复杂度O(n^3))

1.思想:

    遍历所有原字符串的子串,逐个判断每个子串是否是回文。

    判断回文的标准是,从头到尾逐个进行比对,如果首尾都一样就证明该子串是回文。

2.时间复杂度:

    遍历字符串子串:嵌套一个循环、O(n^2);   

    判断是否为回文:再次嵌套一个循环、O(n^3)

3、代码

import java.util.Scanner;

public class Main {
    public static String longestPalindrome(String s){
        if(s.length() <= 1){
            return s;
        }

        for(int i = s.length(); i > 0; i--){//子串长度
            for(int j = 0; j <= s.length()-i; j++){
                String sub = s.substring(j, i+j);//子串位置
                int count = 0;//计数,用来判断是否对称
                for(int k = 0; k < sub.length(); k++){//左右对称判断
                    if(sub.charAt(k) == sub.charAt(sub.length() - k - 1)){
                        count++;
                    }
                    if(count == sub.length() / 2){
                        return sub;
                    }
                }
            }
        }
        return "";
    }

    public static void main(String[] args){
        String str1 = "babad";
        String result1  = longestPalindrome(str1);
        System.out.println("babad: " + result1);

        String str2 = "aba";
        String result2  = longestPalindrome(str2);
        System.out.println("aba: " + result2);


        String str3 = "cabbac";
        String result3  = longestPalindrome(str3);
        System.out.println("cabbac: " + result3);

        String str4 = "acabbac";
        String result4  = longestPalindrome(str3);
        System.out.println("acabbac: " + result3);
    }
}

二、动态规划

 

参考文献:

https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419/

你可能感兴趣的:(数据结构与算法)