文字列のアルゴリズムについて質問します
次のような文字列があるとします。
asda2121ffasas hello hello ah hello hello hello22111000csdnsdn
上記の文字 文字列処理後は、次のようになります。
asda2121ffasas hello hello ah hello hello 221100csdnsdn
つまり、
この文字列では、連続する文字または部分文字列は 2 回を超えることはできません。それ以外の場合は 2 回だけ表示されます。
最悪のアルゴリズムは、文字列をレイヤーごとに変換して各文字と部分文字列の出現数を取得し、2 より大きいものを処理することです。ただし、文字列が非常に長い場合、効率が非常に低くなります。最適化アルゴリズムについて教えてください。ありがとう。
実際、これは私たちのウェブサイトのプランナーからのリクエストです。多くのネチズンはメッセージを残すときに常にいくつかの繰り返しメッセージを書き、それらのメッセージを特定の数だけ表示することを望んでいるからです。表示されなくなります。最悪のアルゴリズムに従うのは非効率すぎるため、このリクエストに関してすでに彼に電話をかけ直しましたが、より効率的なアルゴリズムがあるかどうかを知りたいと思っています。
-----解決策---------
単語の分割後、文字列を 1 つずつ走査することは、基本的には非常に非効率的です。このメソッドをサーバー上に配置する場合は、さらに効率が悪くなります。 JS。
ユーザーがテキストを編集していて、相手が ctrl+c と ctrl+v を判断していないことを検出した場合、ポップアップ ウィンドウを表示して、「お兄さん、csdn はフラッディングできません、そして返信が来ます」コンテンツが短すぎます。" ... $&^#%&*(... ”
------解決策------------------
$s = 'asda2121ffasas こんにちは、こんにちは、こんにちは、こんにちは、こんにちは、こんにちは 22111000csdnsdn ';
echo preg_replace('/(.+)\1+/', '$1$1', $s);
out:
asda2121ffasas こんにちは、こんにちは、こんにちは、221100csdnsdn
$s = 'asda2121ffasas、こんにちは、こんにちは、こんにちは、こんにちは、こんにちは 221111000csdncsdncsdnsdn ';
echo preg_replace('/( .+)\1+/ ', '$1$1', $s);
out:
asda2121ffasas こんにちは、こんにちは、わかりました、わかりました、ああ、こんにちは、こんにちは 221100csdncsdnsdn
------解決策------------------
このアルゴリズムはそれほど単純ではありません。 O(n) はおそらく役に立たないでしょう。
しつこい例の 2 番目の結果では、「OK」が 3 回表示されました。
中国語の正規マッチングを追加しても
このような問題はまだあります
$str = '221112211122111';//'22111' 3回、'1' 3回
最終的な処理は何ですか予想される結果は? 22112211?
------解決策------------------
フロア #23 のアイデアは while ループに戻ります (笑)。
は #9 で考えたことと同じです。
と同じです。 $s = '私はあなた、あなたは私、私はあなた、あなたは私、私はあなた、あなたは私。あなたは私です、あなたは私です、あなたは私です、あなたは私です。 $str = preg_replace('/(.+?)\1{2,}/', '$1$1',$s); while(preg_match('/(.+?)\1{2,}/', $str)) { $str = preg_replace('/(.+?)\1{2,}/', '$1$1',$str); } エコー $str; <div class="clear"></div>