単語に重複文字があるかどうかを判断します.
1445 ワード
今日の午前中に問題を書きました.大体一つの方法を書いて、単語の中に重複文字があるかどうかを判断します.私の考えは文字を一文字ずつ遍歴しています.もし繰り返し停止があると発見されたら、
このような簡単なシーンでは性能についてはあまり意味がなく、二回のサイクル速度は遅くない(
str.indexOf() サイクルとも思われますが、nativeの動作なので、スピードが速いです).その後、他の正則での実現を見ました.簡単ですが、最初は確かに住んでいませんでした.
または:
この二つは区別がありません.前者は文字列の終端を優先的に検索します.後者は文字列の先頭を優先的に探します.この正則の方が分かりやすく、説明が多くなく、驚くべきこのマッチングの性能です.文字列が重複文字があるかどうかを判断するのは簡単すぎるので、対象文字列を表す規則性は小さすぎる.正則を使えば必ず大量の試みと遡及をもたらすが、主観的には性能が悪いと思われる.でも、いいかどうかは勝手に考えればいいです.検証してみます.決定的エネルギーは良いか悪いかはもちろん、最悪の場合、二つのアルゴリズムの実行時間です.このような単語を作成します.
Qwertyuiopasは文字の重複がなく、2つのアルゴリズムが完全なサイクルを走ることを意味します.
function isIsogram(str) {
str = str.toLowerCase();
for (var i = 0; i < str.length; i++) {
if (str.indexOf(str.charAt(i), i + 1) >= 0) {
return false;
}
}
return true;
}
このような簡単なシーンでは性能についてはあまり意味がなく、二回のサイクル速度は遅くない(
str.indexOf() サイクルとも思われますが、nativeの動作なので、スピードが速いです).その後、他の正則での実現を見ました.簡単ですが、最初は確かに住んでいませんでした.
function isIsogram2(str) {
return !/(.).*\1/i.test(str);
}
または:
function isIsogram2(str) {
return !/^.*(.).*\1/i.test(str);
}
この二つは区別がありません.前者は文字列の終端を優先的に検索します.後者は文字列の先頭を優先的に探します.この正則の方が分かりやすく、説明が多くなく、驚くべきこのマッチングの性能です.文字列が重複文字があるかどうかを判断するのは簡単すぎるので、対象文字列を表す規則性は小さすぎる.正則を使えば必ず大量の試みと遡及をもたらすが、主観的には性能が悪いと思われる.でも、いいかどうかは勝手に考えればいいです.検証してみます.決定的エネルギーは良いか悪いかはもちろん、最悪の場合、二つのアルゴリズムの実行時間です.このような単語を作成します.
Qwertyuiopasは文字の重複がなく、2つのアルゴリズムが完全なサイクルを走ることを意味します.
console.time("loop");
for(var i=0; i<400000; i++){
isIsogram("qwertyuiopas");
}
console.timeEnd("loop");
console.time("regexp");
for(var i=0; i<400000; i++){
isIsogram2("qwertyuiopas");
}
console.timeEnd("regexp");
運行結果を見てください.amazing!この実験は一つの問題を確認しました.javascriptは正則に対して確かに最適化があり、正則を使う効率が非常に高いです.もちろん、この言葉は逆にも理解できます.javascriptの文字列操作、サイクルが遅すぎます.正則については何を待っていますか?早く使って転載してください. 今周