题解 | #牛群编号的回文顺序II#

牛群编号的回文顺序II

https://www.nowcoder.com/practice/e887280579bb4d91934378ea359f632e

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode maxPalindrome (ListNode head) {
        // write code here
            ListNode temp = head;
            StringBuilder str = new StringBuilder();
            while (temp != null) {
                str.append(temp.val);
                temp = temp.next;
            }
            boolean checkPalindrome = isPalindrome(str.toString(), 0, str.length() - 1);
            if (checkPalindrome) {
                return null;
            }
            ListNode cur = new ListNode(-1);
            ListNode result = cur;
            String s = longestPalindrome(str.toString());
            for (int i = 0; i < s.length(); i++) {
                ListNode node = new ListNode(s.charAt(i) - 48);
                cur.next = node;
                cur = cur.next;
            }
            return result.next;
        }

        /**
         * 判断字符串是否为回文串
         */
        public boolean isPalindrome(String s, int start, int end) {
            while (start < end) {
                if (s.charAt(start) != s.charAt(end)) {
                    return false;
                }
                start++;
                end--;
            }
            return true;
        }

        /**
         * 找到连续最长的子回文串
         */
        public String longestPalindrome(String s) {
            int maxLength = 1; // 最长回文串的长度
            int start = 0; // 最长回文串的起始位置

            for (int i = 0; i < s.length(); i++) {
                for (int j = i + 1; j < s.length(); j++) {
                    // 如果子串是回文串并且长度大于当前最长回文串的长度,
                    // 更新最长回文串的长度和起始位置
                    if (isPalindrome(s, i, j) && j - i + 1 > maxLength) {
                        maxLength = j - i + 1;
                        start = i;
                    }
                }
            }

            // 根据最长回文串的起始位置和长度截取子串并返回
            return s.substring(start, start + maxLength);
        }
    }

本题知识点分析:

1.链表遍历

2.链表前驱结点和后继结点、虚拟头结点

3.字符串拼接StringBuilder单线程最快

4.字符串回文检测

5.连续最长回文子串(暴力O(n2))

6.Ascii码转数字(减48即可)

本题解题思路分析:

1.不在链表里面直接操作,先遍历一次链表将链表中的所有字符取出

2.第一次判断所有字符是否为回文,如果是,按照题目要求返回空链表,即null

3.调用功能函数,找出最长连续的回文子字符串,然后获取。

4.将找到的最长连续的回文子字符串拼接到一个新的链表上

5.返回虚拟头结点的next即可

6.我觉得此方法是最容易去做题的,但是时间复杂度至少是O(n2)

本题使用编程语言: Java

全部评论

相关推荐

野猪亨利a:基本上不会有下一步
点赞 评论 收藏
分享
已注销:bro不如吃顿疯狂星期四
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务