JavaScriptの中の回文を検査する二つの方法


本稿はFree Code Camp基本アルゴリズムスクリプト「Palindromes検査」に基づいている.
palindromeは単語、フレーズ、数字または他の順序で後ろまたは前に読む文字です.「palindrome」はイギリスの劇作家ベン・ジョンソンが17世紀に創造したもので、その起源はギリシャ語のpalinとdromosである.src.ウィキペディア
本論文では,2つの方法を説明します.一つは内蔵関数を使用し,もう一つはforサイクルを使用します.
アルゴリズムチャレンジ
与えられた文字列が回文である場合、trueを返します.そうでなければfalseを返します.
回文は前または後ろに同じようにつづる単語や文を指しますが、句読点、大文字、空欄は無視されています.
注意:アルファベット以外のすべての文字(句読点、スペース、記号)を削除し、すべての内容を小文字に変換して、パルドルを確認します.
私たちは様々なフォーマットの文字列を伝えます.例えば「racecar」、「RaceCar」、「race CAR」.
function palindrome(str) {
     
  return true;
}
palindrome("eye");
提供するテストの用例
  • palindrome(race car)はtrue
  • に戻ります.
  • palindrome(not a palindrome)はfalse
  • に戻ります.
  • palindrome(「Aマン、a plan、a canal.Panama」)はtrue
  • に戻ります.
  • palindrome(neverodd or even)はtrue
  • に戻ります.
  • palindrome(nope)はfalse
  • に戻ります.
  • palindrome(「almostomla」)はfalse
  • に戻ります.
  • palindrome(My age is 0,0 si ega ym.)はtrue
  • に戻ります.
  • palindrome(「1 eye for of 1 eye.」)はfalse
  • に戻ります.
  • palindrome("/\")0–0")はtrue
  • に戻ります.
    最後のテストケースを通して正しい表現が必要ですか?
    正しい表現は文字列の文字の組み合わせをマッチングするためのモードです.
    検索マッチング項目が直接マッチするものだけを必要としない場合、このモードには特殊な文字が含まれます.
    To pass the last test case, we can use two Regular Expressions:
    
    /[^A-Za-z0–9]/g  or
    
    /[\W_]/g
    
    \Wアルファベット以外のすべての文字を削除します.
  • \Wは単語以外の文字とマッチしています.
  • \Wは[^A-Za-z 0–9_]に相当します.
  • \Wマッチ括弧には含まれていない任意の内容
  • これは何を意味しますか?
    [^A-Z] matches anything that is not enclosed between A and Z
    
    [^a-z] matches anything that is not enclosed between a and z
    
    [^0-9] matches anything that is not enclosed between 0 and 9
    
    [^_] matches anything that does not enclose _
    
    しかし、私たちのテストケースでは、palindrome(「0_0(/-\)-0–0」)がtrueに戻る必要があります.これは「_(:/-)–」に適合しなければならないという意味です.
    私たちはこの特定のテストケースを通過するために「_」を追加する必要があります.
    We now have “\W_”
    
    私たちはまた、gマークを追加してグローバル検索を行う必要があります.
    We finally have “/[\W_]/g”
    
  • /\\W_/gは純粋なデモンストレーション目的でRegExpの働き方を表示します./[^A-Za-z 0–9]/gは最も選択しやすいRegExpです.
  • 1.内蔵機能のある回文を確認する
    この解決策に対して、いくつかの方法を使います.
  • toLowerCase()の方法は呼び出し文字列値を返して小文字に変換します.
  • replace()の方法で返された部分または代替モードのすべてのマッチした新しい文字列.私たちは先ほど作成したRegExpの一つを使用します.
  • split()の方法は、文字列オブジェクトを分割して文字列配列に分割します.
  • reverse()の方法は現在位置で逆回転するアレイです.最初の配列要素は最後となり、最後の配列は最初となります.
  • join()の方法は、文字列配列のすべての要素に接続されています.
  • function palindrome(str) {
         
      // Step 1. Lowercase the string and use the RegExp to remove unwanted characters from it
      var re = /[\W_]/g; // or var re = /[^A-Za-z0-9]/g;
      
      var lowRegStr = str.toLowerCase().replace(re, '');
      // str.toLowerCase() = "A man, a plan, a canal. Panama".toLowerCase() = "a man, a plan, a canal. panama"
      // str.replace(/[\W_]/g, '') = "a man, a plan, a canal. panama".replace(/[\W_]/g, '') = "amanaplanacanalpanama"
      // var lowRegStr = "amanaplanacanalpanama";
         
      // Step 2. Use the same chaining methods with built-in functions from the previous article 'Three Ways to Reverse a String in JavaScript'
      var reverseStr = lowRegStr.split('').reverse().join(''); 
      // lowRegStr.split('') = "amanaplanacanalpanama".split('') = ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"]
      // ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"].reverse() = ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"]
      // ["a", "m", "a", "n", "a", "p", "l", "a", "n", "a", "c", "a", "n", "a", "l", "p", "a", "n", "a", "m", "a"].join('') = "amanaplanacanalpanama"
      // So, "amanaplanacanalpanama".split('').reverse().join('') = "amanaplanacanalpanama";
      // And, var reverseStr = "amanaplanacanalpanama";
       
      // Step 3. Check if reverseStr is strictly equals to lowRegStr and return a Boolean
      return reverseStr === lowRegStr; // "amanaplanacanalpanama" === "amanaplanacanalpanama"? => true
    }
     
    palindrome("A man, a plan, a canal. Panama");
    
    コメントなし:
    function palindrome(str) {
         
      var re = /[\W_]/g;
      var lowRegStr = str.toLowerCase().replace(re, '');
      var reverseStr = lowRegStr.split('').reverse().join(''); 
      return reverseStr === lowRegStr;
    }
    palindrome("A man, a plan, a canal. Panama");
    
    2.FORでループして、回文半索引(len/2)を確認すると、大きな文字列を処理する時に利益があります.各部分の最後を確認して、FORサイクル内の反復回数を2で割ってください.
    function palindrome(str) {
         
     // Step 1. The first part is the same as earlier
     var re = /[^A-Za-z0-9]/g; // or var re = /[\W_]/g;
     str = str.toLowerCase().replace(re, '');
    
     // Step 2. Create the FOR loop
     var len = str.length; // var len = "A man, a plan, a canal. Panama".length = 30
     
     for (var i = 0; i < len/2; i++) {
         
       if (str[i] !== str[len - 1 - i]) {
          // As long as the characters from each part match, the FOR loop will go on
           return false; // When the characters don't match anymore, false is returned and we exit the FOR loop
       }
       /* Here len/2 = 15
          For each iteration: i = ?    i < len/2    i++    if(str[i] !== str[len - 1 - i])?
          1st iteration:        0        yes         1     if(str[0] !== str[15 - 1 - 0])? => if("a"  !==  "a")? // false
          2nd iteration:        1        yes         2     if(str[1] !== str[15 - 1 - 1])? => if("m"  !==  "m")? // false      
          3rd iteration:        2        yes         3     if(str[2] !== str[15 - 1 - 2])? => if("a"  !==  "a")? // false  
          4th iteration:        3        yes         4     if(str[3] !== str[15 - 1 - 3])? => if("n"  !==  "n")? // false  
          5th iteration:        4        yes         5     if(str[4] !== str[15 - 1 - 4])? => if("a"  !==  "a")? // false
          6th iteration:        5        yes         6     if(str[5] !== str[15 - 1 - 5])? => if("p"  !==  "p")? // false
          7th iteration:        6        yes         7     if(str[6] !== str[15 - 1 - 6])? => if("l"  !==  "l")? // false
          8th iteration:        7        yes         8     if(str[7] !== str[15 - 1 - 7])? => if("a"  !==  "a")? // false
          9th iteration:        8        yes         9     if(str[8] !== str[15 - 1 - 8])? => if("n"  !==  "n")? // false
         10th iteration:        9        yes        10     if(str[9] !== str[15 - 1 - 9])? => if("a"  !==  "a")? // false
         11th iteration:       10        yes        11    if(str[10] !== str[15 - 1 - 10])? => if("c" !==  "c")? // false
         12th iteration:       11        yes        12    if(str[11] !== str[15 - 1 - 11])? => if("a" !==  "a")? // false
         13th iteration:       12        yes        13    if(str[12] !== str[15 - 1 - 12])? => if("n" !==  "n")? // false
         14th iteration:       13        yes        14    if(str[13] !== str[15 - 1 - 13])? => if("a" !==  "a")? // false
         15th iteration:       14        yes        15    if(str[14] !== str[15 - 1 - 14])? => if("l" !==  "l")? // false
         16th iteration:       15        no               
        End of the FOR Loop*/
     }
     return true; // Both parts are strictly equal, it returns true => The string is a palindrome
    }
    
    palindrome("A man, a plan, a canal. Panama");
    
    コメントなし:
    function palindrome(str) {
         
     var re = /[^A-Za-z0-9]/g;
     str = str.toLowerCase().replace(re, '');
     var len = str.length;
     for (var i = 0; i < len/2; i++) {
         
       if (str[i] !== str[len - 1 - i]) {
         
           return false;
       }
     }
     return true;
    }
    palindrome("A man, a plan, a canal. Panama");
    
    注:Hunterネットワークセキュリティは、より多くの情報サイトを取得する:bs.kylzrv.com CTFチーム:Hunterネットワークセキュリティ文章:Sonya Moisset排版:Hunter-匿名者