回文判断中将字符串长度除以2的作用是什么?
回文判断中字符串长度除以2的作用解析
核心原因很直白:回文的本质是字符串前半部分和后半部分镜像对称,只需要检查前半部分每个字符和对应的后半部分字符是否相等就足够了,完全没必要遍历整个字符串——这样既砍掉了一半的循环次数,还避免了重复检查已经验证过的配对。
拿你举的'Madam'例子来说:
- 它的长度是5,
str.length / 2等于2.5,循环条件是i < 2.5,所以循环变量i只会取0、1、2这三个值- i=0:比较第0位('M')和倒数第1位(
str[5-1-0]即第4位的'm') - i=1:比较第1位('a')和倒数第2位(
str[5-1-1]即第3位的'a') - i=2:比较第2位('d')和它自己(
str[5-1-2]即第2位的'd')——对于奇数长度的字符串,中间的字符不需要和任何其他字符对比,自己肯定等于自己
- i=0:比较第0位('M')和倒数第1位(
- 要是继续循环i=3,就会去比较第3位的'a'和第1位的'a',这和i=1时的检查完全重复,纯粹是做无用功,所以循环到2.5就停止,刚好覆盖所有需要验证的非重复配对。
另外要提一句,你贴的代码有个严重bug:return true写在循环内部了!这样第一次循环如果没触发return false,就直接返回true,根本不会继续检查后面的字符。比如输入'Madbm',i=0时M和m相等,代码直接返回true,但实际上第1位的'a'和第3位的'b'并不相等,这会导致判断错误。
修正后的代码应该是这样:
function aPalindrome(str) { for (let i = 0; i < str.length / 2; i++) { if (str[i] !== str[str.length - 1 - i]) { return false; } } // 所有配对都检查通过,才返回true return true; }
内容的提问来源于stack exchange,提问作者Ap95
相关产品推荐
相关产品推荐

