我打印了2个字符串,字面上相同,没有空格导致我更换它们。 https://ideone.com/cw07LG 在这里编译
public class Palindrome{
public static boolean isPalindrome(String word){
int length;
String oppositeWord ="";
word = word.replace(" ","");
word = word.toLowerCase();
length = word.length();
for(int i=length-1;i>=0;i--){
if(Character.isLetter(word.charAt(i))){
oppositeWord +=word.charAt(i);
}else{
word = word.replace(word.charAt(i),'\0');
}
}
System.out.println(oppositeWord);
System.out.println(word);
return oppositeWord.equals(word);
}
public static void main(String[]args){
System.out.println(isPalindrome("Madam, I'm Adam"));
}
}
答案 0 :(得分:1)
首先,Java字符串是不可变的,不应该逐个字符地操作(这就是Java库具有StringBuilder和StringBuffer类的原因)。
其次,Java Strings并不等同于C / C ++中的char[]
。它们更像char*
,因为它们指向包含实际信息的其他内存。将非字母字符更改为'\0'
空字符不会从字符串中删除它们。它们不会打印在屏幕上,但仍存在于内存中。 (这是Java字符串与C / C ++字符串不同的一种方式...... Java字符串不是以空字符结尾的字符数组!)
如果您添加一些打印语句来打印长度,您会发现oppositeWord
比word
小两个字符。
System.out.println(oppositeWord.length()); // prints 11
System.out.println(word.length()); // prints 13
要真正使两个字符串相等,word
中替换的相同字符也必须在oppositeWord
中插入相同的索引,或者从两者中完全删除。即。
for(int i=length-1;i>=0;i--) {
if(Character.isLetter(word.charAt(i))) {
oppositeWord +=word.charAt(i);
} else {
word = word.replace(word.charAt(i),'\0');
oppositeWord += word.charAt(i); // << This line!
}
}
现在,两个字符串都将包含相同的信息,oppositeWord.equals(word)
将保留。
另外,仅供参考,StringBuilder
和StringBuffer
都有reverse()
方法,可用于简化此过程。
答案 1 :(得分:0)
用'\ 0'替换一个字符与将所有字符一起删除不是一回事。打印时它不会显示,所以看起来一样,但它仍然存在并且会使它们不相等。
尝试打印长度和单词。
答案 2 :(得分:0)
这一行错了:
word = word.replace(word.charAt(i),'\0');
用\0
替换字符与删除字符不同。你想要这样的东西:
word = word.replace(""+word.charAt(i), "");
然而,正如comment所述,有更好的方法来检查单词是否是回文。
另外,我不确定原因,但您的ideone.com显示了与IDE(NetBeans)不同的输出。你的节目显示:
madamimadam
madamimadam
false
但是Qbrute points out,输出为:
madamimadam
madam i madam
false
这解释了结果为false
的原因。我最好的猜测是,您的在线IDE在将您添加的\0
转换为文本时遇到了一些问题,而且不会打印任何内容。
答案 3 :(得分:0)
正如bluemoon93所提到的那样,这两个字符串实际上并不相等。原来的字符串是女士我的女士。这意味着它由使两个字符串不同的空格组成。我建议您使用正则表达式从原始字符串中删除标点符号,空格。这将删除任何额外的空格或标点符号。
public boolean isPalindrome(String word){
int length;
String oppositeWord ="";
word = word.toLowerCase();
length = word.length();
String newword = word.replaceAll("[\\s\\p{Punct}]", "");
for(int i=length-1;i>=0;i--){
if(Character.isLetter(word.charAt(i))){
oppositeWord +=word.charAt(i);
}
}
System.out.println(oppositeWord);
System.out.println(newword);
return oppositeWord.equals(newword);
}
返回结果现在将返回true,因为两个字符串相等,因为它们与有效字符匹配且不包含空格或标点符号。