【譯】JS基礎算法腳本:迴文檢測

需求

給出一個字符串,檢測是不是迴文,是則返回true,不是則返回false(忽略標點符號,大小寫,空格)正則表達式

palindrome("A man, a plan, a canal. Panama") should return true.
palindrome("five|\_/|four")

思路1

  1. 返回一個忽略標點,空格,小寫的新字符串算法

  2. 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

思路2

  1. 獲得新的反轉字符串,忽略標點符號,空格,大小寫ide

  2. 比較新舊字符串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

思路三

  1. Cyclomatic Complexity循環複雜度regexp

  2. 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^

相關文章
相關標籤/搜索