栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

5. 最长回文子串

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

5. 最长回文子串

  1. 最长回文子串
    给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:

输入:s = “cbbd”
输出:“bb”
示例 3:

输入:s = “a”
输出:“a”
示例 4:

输入:s = “ac”
输出:“a”

提示:

1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成

动态规划和中心扩展法实现:

public class LongestPalindrome {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String s = scanner.nextLine();
        String s1 = longestPalindrome(s);
        String s2 = longestPalindrome2(s);
        System.out.println("中心扩展法最长回文子串:"+s1);
        System.out.println("动态规划法最长回文子串:"+s2);

    }
    //动态规划算法
    private static String longestPalindrome2(String s) {
        int len = s.length();
        if (len<2){
            return s;
        }
        int maxLen = 1;
        int begin = 0;
        //dp[i][j]表示s[i,,,,j]子串,是否是回文字符串
        boolean [][]dp = new boolean[len][len];
        //初始化dp,所有长度为1的子串都是回文串
        for (int i = 0; i < len; i++) {
            dp[i][i] = true;
        }
        char[] array = s.toCharArray();
        //递推,枚举子串长度
        for (int l = 2; l <= len ; l++) {
            for (int i = 0; i < len; i++) {
                //由长度和起始位置推出结束位置:j-i+1=l
                int j = l+i-1;
                if (j>=len){
                    break;
                }
                if (array[i]!= array[j]){
                    dp[i][j] = false;
                }else{
                    if (l<4){
                        dp[i][j] = true;
                    }else{
                        dp[i][j] = dp[i+1][j-1];
                    }
                }
                //只要dp[i][j]为true表明s[i,,,,j]是回文串,记录长度和起始位置
                if (dp[i][j] == true &&j-i+1>maxLen){
                    maxLen = j-i+1;
                    begin = i;
                }
            }

        }
        return s.substring(begin,begin+maxLen);

    }
    //中心扩展算法
    private static String longestPalindrome(String s) {
        if (s == null|| s.length()<1){
            return "";
        }
        int start = 0,end = 0;
        for (int i = 0; i < s.length(); i++) {
            int len1 = expandArroundCenter(s,i,i);//子串为奇数
            int len2 = expandArroundCenter(s,i,i+1);//子串为偶数
            int maxlen = Math.max(len1,len2);
            if (maxlen > end-start){
                start = i-(maxlen-1)/2;
                end = i+maxlen/2;
            }
        }
        return s.substring(start,end+1);
    }

    private static int expandArroundCenter(String s, int left, int right) {
        while (left>=0&&right
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/314801.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号