我正在编写一种方法,当传递一个字符串时,如果它是回文,则返回'true',如果不是回文,则返回'false'。返回回文时,该方法忽略任何标点符号和空格。当我尝试传递字符串“Hannah”时,它返回false。
public static boolean isPalindrome(String p){
String backwardsOriginal = "";
String blank = "";
for(int i =0; i< p.length();i++){
String lookAt = p.substring(i,i+1).toLowerCase();
if ((!lookAt.equals(" ")) || (!lookAt.equals(",")) || (!lookAt.equals(".")) || (!lookAt.equals("!")) ||(!lookAt.equals("?"))) {
blank+=lookAt.toLowerCase();
}
}
for(int j=blank.length();j>=0;j--){
if(j==0)
backwardsOriginal +=blank.substring(0,j+1).toLowerCase();
else
backwardsOriginal += blank.substring(j-1,j).toLowerCase();
}
boolean k = true;
int first = 0;
int last = blank.length()-1;
int ct = 0;
while(k && (ct != blank.length())){
if (last == 0) {
if (blank.substring(blank.length()-1) != backwardsOriginal.substring(0,blank.length())) {
k=false;
}
} else if (last > 0) {
if(blank.substring(first, first+1).equals(backwardsOriginal.substring(last-1,last))) {
k=true;
first++;
last--;
} else {
k=false;
}
}
}
return k;
}
答案 0 :(得分:1)
我会从正则表达式开始,将所有内容转换为单词字符(这是一个特殊的类正则表达式\W
,单词为\w
- 而在Java中,我们必须转义{{ 1}}用于模式)。然后,我会小写并将结果转换为\
。然后,你只需要迭代数组长度的一半 - 如果任何字符都没有在正确的位置char[]
- 如果你到达最后它是一个回文。像,
return false
我用
进行了测试public static boolean isPalindrome(String p) {
char[] arr = p.replaceAll("\\W", "").toLowerCase().toCharArray();
int len = arr.length;
for (int i = 0; i < len / 2; i++) {
if (arr[i] != arr[len - i - 1]) {
return false;
}
}
return true;
}
(它是System.out.println(isPalindrome("A Man, a Plan, a Canal Panama!"));
)。并且,根据您在评论中更新的限制,您可以使用true
实现相同的算法(但您需要两个循环,一个用于构建&#34;正确&#34; StringBuilder
- 另外测试它是否是回文)。像,
String