給出一個字符串,檢測是不是迴文,是則返回true,不是則返回false(忽略標點符號,大小寫,空格)正則表達式
palindrome("A man, a plan, a canal. Panama") should return true. palindrome("five|\_/|four")
返回一個忽略標點,空格,小寫的新字符串算法
for-if 來檢測先後索引字符是否相等數組
function palindrome(str) { str = str.replace(/[\W_]/g,"").toLowerCase(); for(var i = 0,len = str.length -1 ; i < str.length/2; i++) { if(str[i] !== str[len-i]) { return false; } } return true; } palindrome("almostomla"); palindrome("five|\_/|four"); palindrome("_eye"); //0.1279296875ms
獲得新的反轉字符串,忽略標點符號,空格,大小寫ide
比較新舊字符串code
function palindrome(str) { return str.replace(/[\W_]/g,'').toLowerCase() === str.replace(/[\W_]/g,'').toLowerCase().split('').reverse().join(''); } palindrome("almostomla"); palindrome("five|\_/|four"); palindrome("_eye"); //0.001953125ms
Cyclomatic Complexity循環複雜度regexp
Divide and Conquer分治算法索引
function palindrome(str) { let front = 0; let back = str.length - 1; //match匹配是按索引查找的,因此要-1 while (back > front) { //避免重複 //從前日後查找符合條件的字符 while ( str[front].match(/[\W_]/) ) { front++; continue; } //從後往前查找符合條件的字符 while ( str[back].match(/[\W_]/) ) { back--; continue; } //忽略大小寫,比較先後字符 if ( str[front].toLowerCase() !== str[back].toLowerCase() ) { return false }; //繼續循環 front++; back--; } return true; } palindrome("almostomla"); palindrome("five|\_/|four"); palindrome("_eye"); // 0.19580078125ms
str.replace(regexp|substr, newSubstr|function)
replace() 方法返回一個由newSubstr|function替換substr|regexp的新字符串。該方法並不改變調用它的字符串自己,而只是返回一個新的替換後的字符串。ip
str.toLowerCase()
返回一個新的字符串,表示串轉換爲小寫的調用字符。toLowerCase 不會影響字符串自己的值。字符串
str.split([separator[, limit]])
返回一個包含子字符的數組,separator肯定分割位置。不影響原字符串。get
arr.join(separator)
將數組中全部子元素拼接成一個字符串,不改變原數組。separator,默認爲","
有其餘好的方法或思路的道友,不妨在沙發區神交一番。
思路三,有人說他是最好的方案,爲何速度並不快
以及分而治之的思想,複雜度問題,哪位大牛交流下體會^q^