我被要求检查一个字符串是否是回文结构。 不区分大小写。忽略所有不是字母的字符。
我的回答
function palindrome(str) {
var oldStr = str.toLowerCase().replace(/\s+|\,|\.|\_|\-|\:|\(|\)|\/|\\/g, '');
var newStr = str.replace(/\s+|\,|\.|\_|\-|\:|\(|\)|\/|\\/g, '').split("").reverse().join("").toLowerCase();
if ( oldStr === newStr){
return true;
}
else {
return false;
}
}
palindrome("ininiNI");
使用任何字符串可能性检查函数。 示例:(“0_0(:/ - \ :) 0-0”)根据要求应返回true。
我在JavaScript中找不到比上面更好的解决方案。
是否有更快/更好的方法,而不仅仅是写出要移除/替换的每个可能的角色? (特别是因为我所写的内容并非详尽无遗......)
答案 0 :(得分:0)
无需调用toLowerCase()和replace()两次。您也可以将字符串切成两半,反转一个部分然后进行比较。这样你至少可以几次加速你的功能。
优化功能可能如下:
function palindrome(str) {
str = str.toLowerCase().replace(/[^a-z]/g, '');
var max = str.length - 1;
for (var i = Math.floor(max / 2); i >= 0; i--) {
if (str[i] != str[max - i]) {
return false;
}
}
return true;
}
palindrome("inabcbani"); //true
palindrome("abcddcba"); //true
palindrome("a*#$(b)&^@%@%(*a"); //true
palindrome("abba"); //true
palindrome("abcdba"); //false
对于循环来说,这将是我认为最快的方式,因为它快速而简单。一旦找到第一个不匹配的字符,您就可以返回false。