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");
    }
    }
  • 相关阅读:
    微信小程序开发--页面之间的跳转
    iOS基础UI控件介绍-Swift版
    iOS技术栈-Swift版
    SpringBoot实战(四)获取接口请求中的参数(@PathVariable,@RequestParam,@RequestBody)
    SpringBoot实战(三)代码热部署
    SpringBoot实战(二)Restful风格API接口
    SpringBoot实战(一)HelloWorld
    Spring Boot浅谈(是什么/能干什么/优点和不足)
    CentOS的基本设置界面
    虚拟机VM安装Linux系统CentOS7
  • 原文地址:https://www.cnblogs.com/ttaall/p/15719433.html
Copyright © 2011-2022 走看看