• leetcode 5.最长回文子串


    package com.example.lettcode.dynamicprogramming;
    
    import java.util.Arrays;
    
    /**
     * @Class LongestPalindrome
     * @Description 5 最长回文子串
     * 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
     * <p>
     * 示例 1:
     * 输入: "babad"
     * 输出: "bab"
     * 注意: "aba" 也是一个有效答案。
     * <p>
     * 示例 2:
     * 输入: "cbbd"
     * 输出: "bb"
     * @Author
     * @Date 2020/8/5
     **/
    public class LongestPalindrome {
        /**
         * 动态规划: 解法和leetcode 647 回文子串 类似
         * (1)dp[i][j]表示从s[i..j]是否为回文子串
         * (2)状态转换:
         *      i:当j-i<3 并且s[i]=s[j]时,即类似abs时,也是回文串
         *      ii: 当s[i]=s[j]并且s[i+1...j-1]是回文串时,s[i...j]是回文串
         */
        public static String longestPalindrome(String s) {
            if (s == null || s.length() == 0) return "";
            boolean[][] dp = new boolean[s.length()][s.length()];
            int start = 0, end = 0;
            for (int i = 0; i < s.length(); i++) {
                for (int j = 0; j < s.length(); j++) {
                    dp[i][j] = false;
                }
                dp[i][i] = true;
            }
            for (int i = s.length() - 2; i >= 0; i--) {
                for (int j = i + 1; j < s.length(); j++) {
                    dp[i][j] = s.charAt(i) == s.charAt(j)
                            //小于3是因为aba一定是回文
                            && (j - i < 3 || dp[i + 1][j - 1] == true);
                    // dp[i][j]为True,并且需要更新的话
                    if (dp[i][j] && end - start < j - i) {
                        end = j;
                        start = i;
                    }
                }
            }
            return s.substring(start, end + 1);
        }
    
        public static void main(String[] args) {
            String s = "babad";
            String ans = longestPalindrome(s);
            System.out.println("LongestPalindrome demo01 resul:" + ans);
    
            s = "cbbd";
            ans = longestPalindrome(s);
            System.out.println("LongestPalindrome demo02 resul:" + ans);
        }
    }
    
  • 相关阅读:
    Spark数据读取
    05、TypeScript 中的泛型
    04、TypeScript 中的接口
    03、TypeScript 中的类
    02、TypeScript 中的函数
    01、TypeScript 数据类型
    Vue-router 知识点
    什么是跨域?如何解决跨域问题
    工作中积累的问题、知识点总结100题(0-20)
    封装一个 Promise 对象。了解其原理
  • 原文地址:https://www.cnblogs.com/fyusac/p/13530663.html
Copyright © 2020-2023  润新知