【发布时间】:2021-10-10 21:03:15
【问题描述】:
Leetcode 问题 125. 有效回文:
Given a string s, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
Example 1:
Input: s = "A man, a plan, a canal: Panama"
Output: true
Explanation: "amanaplanacanalpanama" is a palindrome.
我将每个字符附加到两个链表中,一个向前一个向后,并比较它们。但是,我没有超过时间限制。 Leetcode 的解决方案使用了 StringBuilder 并将其反转。听说StringBuilder的实现类似于链表。我不知道为什么我的代码比解决方案慢得多。我将不胜感激有关此主题的任何反馈或见解。提前谢谢你。
我的代码:
class Solution {
public boolean isPalindrome(String s) {
LinkedList<Character> forward = new LinkedList<Character>();
LinkedList<Character> backward = new LinkedList<Character>();
for(int i = 0 ; i < s.length() ; i++){
char ch = s.charAt(i);
if(Character.isLetterOrDigit(ch)){
if(Character.isLetter(ch)) ch = Character.toLowerCase(ch);
forward.addLast(ch);
backward.addFirst(ch);
}
}
for(int i = 0 ; i < forward.size() ; i++){
if(forward.get(i) != backward.get(i)) return false;
}
return true;
}
}
Leetcode 解决方案:
class Solution {
public boolean isPalindrome(String s) {
StringBuilder builder = new StringBuilder();
for (char ch : s.toCharArray()) {
if (Character.isLetterOrDigit(ch)) {
builder.append(Character.toLowerCase(ch));
}
}
String filteredString = builder.toString();
String reversedString = builder.reverse().toString();
return filteredString.equals(reversedString);
}
}
【问题讨论】:
-
可能是因为
linkedList.get(i)是一个 O(n) 操作(它必须遍历列表才能找到元素i)。这会导致您的比较循环实际上是 O(n^2)。 -
听说StringBuilder的实现类似于链表。我我找到的在线源代码(JDK 8)显示实现是一个char数组。
-
"听说StringBuilder的实现类似于链表。"不是。
-
我猜道德是,不要相信你在互联网上听到的一切:-)
标签: java linked-list stringbuilder palindrome