Лично я делаю это таким образом, и нет никаких совпадений; код перестает проверять соответствие символов в правильном месте, имеет ли строка четную или нечетную длину. Некоторые из других методов, опубликованных выше, будут пытаться сопоставить один дополнительный раз, когда это не нужно.
Если мы используем length / 2, он все равно будет работать, но он сделает еще одну проверку, которая ему не нужна. Например, «pop» имеет длину 3. 3/2 = 1,5, поэтому он прекратит проверку, когда i = 2 (поскольку 1 <1,5, он также проверит, когда i = 1), но нам нужно, чтобы он остановился на 0, а не на одном. Первое «p» находится в позиции 0, и оно проверит себя по длине-1-0 (текущая позиция), которая является последним «p» в позиции 2, а затем мы останемся с центральной буквой, которая не нуждается в проверке. Когда мы делаем length / 2, мы останавливаемся на 1, поэтому происходит дополнительная проверка, когда я нахожусь в позиции 1 («o») и сравнивает ее с собой (length-1-i). </p>
// Checks if our string is palindromic.
var ourString = "A Man, /.,.()^&*A Plan, A Canal__-Panama!";
isPalin(ourString);
function isPalin(string) {
// Make all lower case for case insensitivity and replace all spaces, underscores and non-words.
string = string.toLowerCase().replace(/\s+/g, "").replace(/\W/g,"").replace(/_/g,"");
for(i=0; i<=Math.floor(string.length/2-1); i++) {
if(string[i] !== string[string.length-1-i]) {
console.log("Your string is not palindromic!");
break;
} else if(i === Math.floor(string.length/2-1)) {
console.log("Your string is palindromic!");
}
}
}
https://repl.it/FNVZ/1