關於字串的一個演算法請問

來源:互聯網
上載者:User
關於字串的一個演算法請教
假設我有這麼一段字串:
asda2121ffasas你好你好啊你好你好你好啊22111000csdnsdn



上面這個字串處理後應該為:
asda2121ffasas你好你好啊你好你好啊221100csdnsdn


也就是說:
在這段字串中,任何連續出現的字元或子字串,不能大於兩次,否則就只顯示兩次。

最差的演算法應該是把字串一層層便利,得出每一個字元及子字串所出現的次數,有大於2的加以處理。但如果這個字串很長的話,效率實在太低了。請教最佳化演算法。謝謝。


其實這是我們網站的策劃給我提的一個需求,因為有很多網友在留言的時候總是寫一些重複的留言,他想讓這些留言只顯示一定次數多餘的就不顯示了。這個需求我已經給他打回去了,因為如果按照最差的演算法效率實在太低,但還是想知道有沒有什麼比較高效的演算法。

------解決方案--------------------
分詞之後, 再去一個個遍曆字串, 基本上和你所說的很不效率, 如果放在伺服器更是要命, 假使你真的想實現這個方法, 建議你把它放在用戶端用JS實現。

當使用者在編輯文本時, 監測到對方不判斷ctrl+c和ctrl+v, 你就給它不停彈視窗,“哥們, csdn不可以灌水, 不可以回複內容太短噢 ... $&^#%&*(... ”
------解決方案--------------------
$s = 'asda2121ffasas你好你好啊你好你好你好啊22111000csdnsdn ';
echo preg_replace('/(.+)\\1+/', '$1$1', $s);

out:
asda2121ffasas你好你好啊你好你好啊221100csdnsdn


$s = 'asda2121ffasas你好你好啊好啊好啊你好你好你好啊22111000csdncsdncsdnsdn ';
echo preg_replace('/(.+)\\1+/', '$1$1', $s);

out:
asda2121ffasas你好你好啊好啊好啊你好你好啊221100csdncsdnsdn
------解決方案--------------------
這個演算法沒那麼簡單吧。O(n)估計沒戲。
嘮叨例子的第二次結果裡出現了3次'好啊'了。
即使加入中文正則匹配
問題還有類似這樣的
$str = '221112211122111';//'22111' 3次,'1' 3次
最終處理結果希望是什麼樣?22112211?

------解決方案--------------------
#23樓的思路回到while迴圈那去了,呵呵.
就如我#9想的一樣.等同於
PHP code
$s = '我是你你是我我是你你是我我是你你是我.我是你你是我我是你你是我我是你你是我.我是你你是我我是你你是我我是你你是我.我是你你是我我是你你是我我是你你是我';$str = preg_replace('/(.+?)\\1{2,}/', '$1$1',$s);while(preg_match('/(.+?)\\1{2,}/', $str)){    $str = preg_replace('/(.+?)\\1{2,}/', '$1$1',$str);}echo $str;
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.