zoukankan      html  css  js  c++  java
  • Leecode no.5 最长回文子串

    package leecode;

    /**
    * 5. 最长回文子串
    *
    * 给你一个字符串 s,找到 s 中最长的回文子串。
    * @author Tang
    * @date 2021/12/22
    */
    public class LongestPalindrome {

    char[] chars;

    /**
    * 从头到尾每个元素遍历
    * 判断以每个元素为中心分别向左右伸展的最大回文数
    *
    * @param s
    * @return
    */
    public String longestPalindrome(String s) {
    chars = s.toCharArray();

    String maxLine = null;
    for(int i = 0; i < chars.length; i++) {
    String palindrome = maxPalindrome(i);
    if(maxLine == null || palindrome.length() > maxLine.length()) {
    maxLine = palindrome;
    }
    }

    return maxLine;
    }

    /**
    *
    * @param index 中心元素索引
    * @return 最大回文数
    */
    private String maxPalindrome(int index) {
    if(index == 0 || index == chars.length - 1) {
    //过一下测试用例bb
    if(chars.length == 2 && chars[0] == chars[1]) {
    return String.valueOf(chars);
    }

    return String.valueOf(chars[index]);
    }

    //单数回文情况
    int leftIndex = index - 1;
    int rightIndex = index + 1;
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(chars[index]);
    String line = getMax(stringBuilder, leftIndex, rightIndex);

    //双数回文情况 (中心元素和左边元素相同)
    if(chars[index] == chars[index-1]) {
    leftIndex = index - 1;
    rightIndex = index;
    StringBuilder stringBuilder2 = new StringBuilder();
    stringBuilder.append(chars[leftIndex]);
    stringBuilder.append(chars[rightIndex]);
    String leftLine = getMax(stringBuilder2, leftIndex, rightIndex);
    line = leftLine.length() > line.length() ? leftLine : line;
    }

    //双数回文情况 (中心元素和右边元素相同)
    if(chars[index] == chars[index+1]) {
    leftIndex = index;
    rightIndex = index + 1;
    StringBuilder stringBuilder2 = new StringBuilder();
    stringBuilder.append(chars[leftIndex]);
    stringBuilder.append(chars[rightIndex]);
    String leftLine = getMax(stringBuilder2, leftIndex, rightIndex);
    line = leftLine.length() > line.length() ? leftLine : line;
    }
    return line;
    }

    /**
    * 通过两个指针不断向外判断最大的回文数量
    *
    * @param leftIndex
    * @param rightIndex
    * @return
    */
    private String getMax(StringBuilder line, int leftIndex, int rightIndex) {
    while(leftIndex >= 0 && rightIndex < chars.length) {
    if(chars[leftIndex] != chars[rightIndex]) {
    break;
    }
    line.insert(0, chars[leftIndex]);
    line.append(chars[rightIndex]);
    leftIndex--;
    rightIndex++;
    }
    return line.toString();
    }

    public static void main(String[] args) {
    new LongestPalindrome().longestPalindrome("babad");
    }
    }
  • 相关阅读:
    验证SMTP工作过程
    FileZilla FTP服务器的安装和配置
    最后一块石头的重量
    不用加号的加法
    同构字符串
    最长公共子序列
    Telnet 验证HTTP工作过程
    矩阵的最小路径和
    子数组的最大累加和问题
    海思开发板——YOLOv3模型移植(4)
  • 原文地址:https://www.cnblogs.com/ttaall/p/15719433.html
Copyright © 2011-2022 走看看