zoukankan      html  css  js  c++  java
  • leetcode-5-最长回文子串

    问题:

    方法一:中心扩散方方法

    package com.example.demo;
    
    import java.util.jar.JarEntry;
    
    public class Test05 {
    
        public static void main(String[] args) {
            findMedianSortedArrays("o2o2o1o2o2oaaaaaaaaaaaaa");
        }
    
        /**
         * 寻找字符串中的最长回文子串
         * 中心扩散法选择一个位置作为回文字符串的中心,比较中心两边的字符是否相等(需要区分两种情况,中心是一个字符和不是一个字符)
         */
        private static void findMedianSortedArrays(String s) {
            int len = s.length();
            if (len == 0) {
                System.out.println("无回文字符串");
            }
    
            int longtestpalindrome = 0;
            String longestPalidromeStr = "";
            // 中心点充开头开始向后移动
            for (int i = 0; i < len; i++) {
                //中心是一个字符(回文字符串长度为奇数)
                String lenEven = centerSpread(s, i, i);
                String lenOdd = centerSpread(s, i, i + 1);
                String maxStr = lenEven.length() > lenOdd.length() ? lenEven : lenOdd;
                if (maxStr.length() > longtestpalindrome) {
                    longestPalidromeStr = maxStr;
                    longtestpalindrome = maxStr.length();
                }
    
            }
            System.out.println(longestPalidromeStr + ":" + longtestpalindrome);
    
        }
    
        /**
         * 中心扩展提交中心两侧的位置,返回符合条件的长度
         */
        private static String centerSpread(String str, int left, int right) {
            int l = left, r = right;
            while (l >= 0 && r < str.length() && str.charAt(l) == str.charAt(r)) {
                l--;
                r++;
            }
            return str.substring(l + 1, r);
        }
    
    }

    方法二:动态规划

     public static void main(String[] args) {
            findMedianSortedArrays1("ac");
        }
    
        /**
         * 动态规划(适合问题重叠子问题,最优子结构)
         * 1、定义状态
         * 2、找到状态转义方程
         * s[i][j]:表示i到j之间字符串,左闭右闭
         * dp[i][j]:一个二位数组,使用true,false来表示s[i][j]是否是是回文序列
         * 当判断dp[i][j]是否是回文序列时,即s[i] == s[j]时,只需要判断dp[i+1][j-1]是否是回文序列
         *   ps:当 j - i < 2 时,表示s[i][j]中只有1个或没有元素,此时必定是回文,不需要判断dp[i+1][j-1]是否是回文序列了
       * 状态转义方程: dp[i][j] = s[i] == s[j] && ( j - i <= 2 || dp[i + 1][j - 1]) * *
    @param s */ private static String findMedianSortedArrays1(String s) { int len = s.length(); if (len <= 1) { return s; } int longestPalidrome = 1; String longestPalidromeStr = s.substring(0, 1); boolean[][] dp = new boolean[len][len]; //right从索引1出开始向有移动 for (int right = 1; right < len; right++) { for (int left = 0; left < right; left++) { //状态转义方程 if (s.charAt(right) == s.charAt(left) && (right - left <= 2 || dp[left + 1][right - 1])) { dp[left][right] = true; if (longestPalidrome < (right - left + 1)) { longestPalidromeStr = s.substring(left, right + 1); longestPalidrome = right - left + 1; } } } } System.out.println(longestPalidromeStr + ":" + longestPalidrome); return longestPalidromeStr; }
  • 相关阅读:
    深入理解Java8中Stream的实现原理
    RocketMQ的顺序消费和事务消费
    Java 性能调优小技巧
    类加载机制基础
    十大经典排序算法
    分布式锁的几种常用实现方式
    python之接口开发
    python之urllib模块和requests模块
    python之time模块和hashlib模块
    python之os和sys模块的区别
  • 原文地址:https://www.cnblogs.com/nxzblogs/p/11176807.html
Copyright © 2011-2022 走看看