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) { 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; } /** * 判断字符串是否为回文串 * @param s 字符串 * @param start 起始位置 * @param end 结束位置 * @return 字符串是否为回文串 */ 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; } /** * 找到连续最长的子回文串 * @param s 字符串 * @return 连续最长的子回文串 */ 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
如果您觉得本篇文章对您有帮助的话,可以点个赞支持一下,感谢~