给我自己一个菜鸟称呼它会使菜鸟看起来不好...让我们先看一下代码 ...
bool isPalindrome(String s){
for(int i = 0; i < s.length/2;i++){
if(s[i] != s[(s.length-1) -i])
return false;
}
return true;
}
main() {
print(isPalindrome("anna"));
print(isPalindrome("cat"));
}
... 结果为真-假
即使我将s.length
中的字母数更改为"cat"
,在“初学者” Dart示例列表中还是发现"cats"
是“假”,所以它没有计算字母的数量,但是"caac"
是“ true”。
有人可以详细说明该代码的作用吗。
答案 0 :(得分:2)
您的误解不在代码中,而是在“回文”中。回文是一个单词,其拼写相同且前后颠倒。例如,如果您使用单词“ racecar”并颠倒字母顺序,则结果将是“ racecar”,即完全相同的单词。
代码对“ anna”返回true,因为这仍然是正确的-向后“ anna”又是“ anna”。它为“猫”返回false,因为向后拼写为“ tac”,这是一个完全不同的词,因此表明“猫”不是回文。 (同样,向后“ caac”是“ caac”,因此是回文,而向后“ cats”是“ stac”,因此不是回文。)
代码的工作方式是将单词中的每个字母与镜像位置的字母进行比较。例如,第一个字母的镜像位置是最后一个字母,第二个字母是倒数第二个字母,依此类推。如果字母相同,则循环继续。如果到达末尾且所比较的每个字母都相同,则该单词的前后拼写相同,这意味着它是回文。
V
racecar ==Same letter, continuing==
^
V
racecar ==Same letter, continuing==
^
V
racecar ==Same letter, continuing==
^
V
racecar ==Same letter, continuing==
^
==The end has been reached, the word is a palindrome, return true==
但是,如果它曾经达到一个字母和相反位置的字母不相同的点,则意味着该单词向后的拼写与向前的拼写不会相同,这意味着它不是回文。
V
abcaa ==Same letter, continuing==
^
V
abcaa ==Different letter, the word is not a palindrome, return false==
^
(在循环中仅上升到length/2
的原因是,一旦支票通过中间标记,它将开始比较已经比较过的字母。即在“ abcde”中,将“ b”与“ d”与将“ d”与“ b”进行比较相同,因此循环会中途切出以避免不必要的比较。)