我必须检查回文字符串。当我输入具有数值的字符串时,我得到一个错误的答案。例如"0P"



我必须忽略字符串中的所有特殊字符。我创建了一个仅包含字母数字字符的新字符串s1。然后,制作一个反向字符串s2,然后检查它们是否为Palindrome。

class Solution 
{
public boolean isPalindrome(String s)
{
char c,ch;
String s1="";
String s2="";
s=s.trim();
s=s.toLowerCase();
if(s=="")
return true;
for(int i=0;i<s.length();i++)
{
c=s.charAt(i);
if(c>=97&&c<=122||c>=0&&c<=9)
s1=s1+c;
}
for(int j=s1.length()-1;j>=0;j--)
{
ch=s1.charAt(j);
s2=s2+ch;
}
if(s1.equals(s2))
return true;
else
return false;  
}
}
String str = "@ Test!#@!#!@92432432";
String tmp = str.replaceAll("[^a-zA-Z0-9]", "");
System.out.println(tmp);  

打印

Test92432432

参考编号:如何忽略字符串中的特殊字符和空格?

据我所知,您使用c>=0&&c<=9来检查c的数字。这是错误的,因为'0' == 48'9' == 57,你必须使用c>=48&amp;c<57


我想给你一些关于你的代码的评论:

  1. 字符串在java中是一个不可变的对象,有很多字符串串联-是一种非常糟糕的做法。请使用StringBuilder
  2. 您可以使用s.isEmpty()而不是s==""
  3. Character类有静态方法isDigitisAlphabetic,它们是数字或字母的检查字符
  4. 如果要使用StringBuilder,只需使用stringBuilder.reverse()方法即可反转字符串
  5. 在方法的最后,如果s1.equals(s2)和false-overwise,则返回true。您可以使用return s1.equals(s2);
  6. 你可以用for (char c : s.toCharArray())循环遍历字符串

最后的代码是

public static boolean isPalindrome(String s)
{
s=s.trim();
s=s.toLowerCase();
if(s.isEmpty())
return true;
StringBuilder sanitizedString = new StringBuilder();
for (char c : s.toCharArray()) {
if(Character.isAlphabetic(c) || Character.isDigit(c))
sanitizedString.append(c);
}
String s1 = sanitizedString.toString();
String s2 = sanitizedString.reverse().toString();
return s1.equals(s2)
}

您可以使用@RR_IL答案中的regexp来避免循环。

您可以使用这样的东西:

public static boolean isPalindrome(String s)
{
int i = 0;
int j = s.length() - 1; 
while (i < j) { 
if (s.charAt(i) != s.charAt(j)) 
return false; 
i++; 
j--; 
}
return true; 
}

最新更新