我必须忽略字符串中的所有特殊字符。我创建了一个仅包含字母数字字符的新字符串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&;c<57
我想给你一些关于你的代码的评论:
- 字符串在java中是一个不可变的对象,有很多字符串串联-是一种非常糟糕的做法。请使用StringBuilder
- 您可以使用
s.isEmpty()
而不是s==""
Character
类有静态方法isDigit
和isAlphabetic
,它们是数字或字母的检查字符- 如果要使用StringBuilder,只需使用
stringBuilder.reverse()
方法即可反转字符串 - 在方法的最后,如果
s1.equals(s2)
和false-overwise,则返回true。您可以使用return s1.equals(s2);
- 你可以用
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;
}