java 中的字符串回文检查器不起作用?
String palindrome checker in java not working?
我正在尝试为这些指令编写程序:
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
Note: For the purpose of this problem, we define empty String
as valid palindrome.
https://leetcode.com/problems/valid-palindrome/
出于某种原因,最后一行中的 .reverse()
没有反转它。我已经尝试通过添加 print 语句进行调试,并且我看到字符串确实在早些时候反转了。这里发生了什么?请指导我!
public static boolean isPalindrome(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (Character.isLetter(s.charAt(i))) {
sb.append(s.charAt(i));
}
}
String x = sb.reverse().toString();
System.out.println(x);
if (sb.length() == 0)
return true;
else
return sb.toString().equals(x);
}
问题是 reverse()
改变了 StringBuilder
本身。因此,您正在将相反的情况与再次相反的情况进行比较。而是将您的方法更改为:
String x = sb.toString();
return sb.reverse().toString().equals(x);
这将比较 StringBuilder
before 反转,与反转 StringBuilder
。请注意 if(sb.length == 0)
不是必需的,因为如果它是空的,sb.reverse().toString().equals(x)
仍然会 return 为真。
您的搜索也区分大小写,当问题陈述表明无论大小写都应该匹配时。更改附加到的位置:
if (Character.isLetter(s.charAt(i))) {
sb.append(Character.toLowerCase(s.charAt(i)));
}
您还可以利用 replaceAll
和 toLowerCase()
将您的方法缩短为:
public static boolean pali(String s) {
String copy = s.toLowerCase().replaceAll("[^a-z]", "");
return new StringBuilder(copy).reverse().toString().equals(copy);
}
因为在第一次调用 sb.reverse()
之后 sb 改变了它的状态。
我正在尝试为这些指令编写程序:
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. Note: For the purpose of this problem, we define empty
String
as valid palindrome. https://leetcode.com/problems/valid-palindrome/
出于某种原因,最后一行中的 .reverse()
没有反转它。我已经尝试通过添加 print 语句进行调试,并且我看到字符串确实在早些时候反转了。这里发生了什么?请指导我!
public static boolean isPalindrome(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (Character.isLetter(s.charAt(i))) {
sb.append(s.charAt(i));
}
}
String x = sb.reverse().toString();
System.out.println(x);
if (sb.length() == 0)
return true;
else
return sb.toString().equals(x);
}
问题是 reverse()
改变了 StringBuilder
本身。因此,您正在将相反的情况与再次相反的情况进行比较。而是将您的方法更改为:
String x = sb.toString();
return sb.reverse().toString().equals(x);
这将比较 StringBuilder
before 反转,与反转 StringBuilder
。请注意 if(sb.length == 0)
不是必需的,因为如果它是空的,sb.reverse().toString().equals(x)
仍然会 return 为真。
您的搜索也区分大小写,当问题陈述表明无论大小写都应该匹配时。更改附加到的位置:
if (Character.isLetter(s.charAt(i))) {
sb.append(Character.toLowerCase(s.charAt(i)));
}
您还可以利用 replaceAll
和 toLowerCase()
将您的方法缩短为:
public static boolean pali(String s) {
String copy = s.toLowerCase().replaceAll("[^a-z]", "");
return new StringBuilder(copy).reverse().toString().equals(copy);
}
因为在第一次调用 sb.reverse()
之后 sb 改变了它的状态。