2017-11-22 7 views
0

右、私はコードを実行しています。 "codewarriors"が "io"のように最長母音部分文字列の長さを返すことが目的です私はそれを解決した方法は、非母音をスペースで置き換え、母音を配列に残して分割し、この配列をループし、最初の部分文字列を別の配列にプッシュすることで、別のループを設定します最初の配列の値をループし、2番目の配列で長さをチェックし、必要に応じて最長の配列に置き換えます。コードワードの挑戦 - 最長母音サブ文字列

これは最初の値(他の値と比較する値)をプッシュしているので問題に遭遇しましたが、2番目のループで置き換えなければならないのは置き換えが必要な値です最初の値が最も長い場合、配列はオブジェクトになります。2番目のループで置換する必要がある場合は置換されますが、文字列に変換されます。これは、長さを与える終了のreturn文がlongest.lengthと、最長の[0] .lengthとの間で変更します。最後にtypeofを条件付きでチェックして周りに乗りましたが、周りに別の方法があるのでしょうか?

私は初心者ですので、上記を少し混乱させると私を許し、挑戦を解決するための他の方法のヒントは大歓迎です。

これは動作しないコードである -

function longestVowel(str) { 

    var seperateVowels = str.replace(/[bcdfghjklmnpqrstvwxyz]/ig, ' '); 

    var split = seperateVowels.split(" "); 

    var longest = []; 
    for(var i = 0; i < split.length; i++) { 
    if(longest.length === 0 && split[i] != "") { 
     longest = split[i]; 
    } for(var j = 0; j < longest.length; j++) { 
     if(split[i].length > longest[j].length) { 
     longest = split[i]; 
     } 
    } 
    } 

    return longest.length; 

} 

そして、ここでは、周りの私の仕事である -

function longestVowel(str) { 

    var seperateVowels = str.replace(/[bcdfghjklmnpqrstvwxyz]/ig, ' '); 

    var split = seperateVowels.split(" "); 

    var longest = []; 
    for(var i = 0; i < split.length; i++) { 
    if(longest.length === 0 && split[i] != "") { 
     longest.push(split[i]); 
    } for(var j = 0; j < longest.length; j++) { 
     if(split[i].length > longest[j].length) { 
     longest = split[i]; 
     } 
    } 
    } 

    if(typeof longest == "object") { 
    return longest[0].length; 
    } else { 
    return longest.length; 
    } 

} 

longestVowel("suoidea"); 
+0

@ヴァサン:あなたはトラバース中に見た最も高いカウンターバリューを追跡する必要があることを忘れてしまった。 – MrSmith42

+3

長さを指定したい場合は、最初の位置でカウンタを開始し、文字列をたどって、母音以外が表示された場合はカウンタをリセットしないでください。リセットする前に、現在のカウンタ値が現在の最大値より大きい場合、カウンタを 'max'変数に格納してください。ありがとう@ MrSmith42 – Vasan

+0

非常に助けてくれてありがとうVasanこれははるかに良い方法です! –

答えて

1

私が最初に非母音をフィルタリングして、分割するあなたのアプローチが好きそれを配列に変換します。

編集:修正答えのコメントで提案のおかげ:

function longestVowel(str) { 
    let separateVowels = str.replace(/[^aeiou]/ig, ' ').split(' '); 
    let longest; 

    separateVowels.forEach(function(vowelGroup) { 
    longest = vowelGroup.length > longest.length 
     ? vowelGroup 
     : longest; 
    }); 

    return longest; 
} 

console.log(longestVowel('suoidea')); // uoi 

またはJavaScript 1.8/EcmaScript5と:

function longestVowel(str) { 
    let separateVowels = str.replace(/[^aeiou]/ig, ' ').split(' '); 
    let longest = separateVowels.reduce(function(a, b) { 
    return a.length > b.length ? a : b; 
    }); 

    return longest; 
} 

オリジナルの答え:私はからこの問題を解決したい 方法長さで配列をソートし、最初の(したがって最長の)項目を取得するだけです:

function longestVowel(str) { 
    let separateVowels = str.replace(/[bcdfghjklmnpqrstvwxyz]/ig, ' ').split(' '); 
    let longest = separateVowels.sort(function (a, b) { 
    return b.length - a.length; 
    })[0]; 

    return longest; 
} 

console.log(longestVowel('suoidea')); // uoi 
+3

正規表現は '/ [^ aeiou]/ig'と短縮することができると思います。また、並べ替えは 'O(n log n)'ですが、maxを見つけることは線形時間 'O(n)'で行うことができます。 – Vasan

+0

ありがとう@バサン。あなたは編集を見直すことができますか? – Kano

1

ここで線形アルゴリズムO(n)の背後にあるアイデアは、実際には配列の各要素を一度見るだけでよいということです。

反復の各段階では、これまでの最長母音部分文字列と現在考えられている最長母音部分文字列を保持する2つの変数globalMaxcurrentMaxを維持します。

母音が出現すると、母音以外の文字が出現するまでどれくらいの時間をおいてから始めるのかを確認します。それはもはや母音サブストリングにならない時点までです。これはcurrentMaxとなり、これをglobalMaxと比較して、長い母音部分文字列があるかどうかを確認します。だから、globalMaxはすべてcurrentMax

が入力されたと仮定し 『彼らは母音のですが、i = 3で、我々は部分文字列は、もはやであることを気づかないとして、我々は、フォームi = 2 to 3を数えるsuoideaoi』ここ

i | s[i] | currentMax | globalMax 
-------|--------|-------------|----------- 
    0 | s |  0  | 0 
    1 | u |  0  | 0 
    2 | o |  1  | 1 
    3 | i |  2  | 2 
    4 | d |  0  | 2 
    5 | e |  1  | 2 
    6 | a |  2  | 2 
    7 | o |  3  | 3 
    8 | i |  4  | 4 

'がベストです私たちはそこに停止してリセットして、もはやサブストリング母音currentMax

何このO(n)を作ることは、我々はs[2] to s[3]すなわち)oiをサブストリングの母音をチェックした後、我々はこのことを確認することができますということです0に後に来るかもしれない母音部分文字列の中で母音部分文字列を考慮する必要はないので、母音部分文字列ではない部分文字列を含むようにする。

関連する問題