var isAlmostPalindrome = function(s) {
const str = s.replace(/[^A-Za-z0-9]/g, '').toLowerCase();
const strHalf = Math.floor(str.length / 2)
let rightPtr = str.length - 1;
let leftPtr = 0;
let forwardArr = new Array();
let backwardArr = new Array();
for (let i = 0; i < str.length; i++) {
let char = str[i];
let backChar = str[rightPtr];
if (char !== backChar) {
while (i < str.length -1) {
char = str[i+1];
forwardArr.push(char);
i++;
}
break;
}
forwardArr.push(char);
rightPtr--;
}
for (let j = str.length-1; j > 0; j--) {
let char = str[leftPtr];
let backChar = str[j];
if (char !== backChar) {
backChar = str[j-1];
while (j > 0) {
backChar = str[j-1];
backwardArr.push(backChar);
j--;
}
break;
}
backwardArr.push(backChar);
leftPtr++;
}
let compareForStr = forwardArr.join("");
let compareBackStr = backwardArr.join("");
if (compareForStr !== str) {
let rev = "";
// generate a reverse string using a reverse for loop.
for(let l = compareForStr.length - 1; l >= 0; l--) {
rev += compareForStr[l];
}
if (rev === compareForStr) {
return true;
}
if (compareBackStr !== str) {
let rev = "";
// generate a reverse string using a reverse for loop.
for(let l = compareBackStr.length - 1; l >= 0; l--) {
rev += compareBackStr[l];
}
if (rev === compareBackStr) {
return true;
}
}
} else {
return true;
}
return false;
}
//console.log(isAlmostPalindrome("A man!, a plan, a canal: Panada")) //false
//console.log(isAlmostPalindrome("A man!, a plan, a canal: Panama")) //true
//console.log(isAlmostPalindrome("race a car")) //true
console.log(isAlmostPalindrome("abca")) //true
//console.log(isAlmostPalindrome("eeccccbebaeeabebccceea")) //true ! compare back string
//console.log(isAlmostPalindrome("abccdba")) //true ! compare back string
//console.log(isAlmostPalindrome("abcdefdba")) //false !
//console.log(isAlmostPalindrome("")) //true !
//console.log(isAlmostPalindrome("a")) //true !
//console.log(isAlmostPalindrome("ab")) //true
//console.log(isAlmostPalindrome("eedede")) //true
//console.log(isAlmostPalindrome("abc")) //false
//console.log(isAlmostPalindrome("A man, a plan, a canal: Padama")) //false