2012-08-29 30 views
4

是否可以使用C#查找和替換字符串中的任何重複字符?我試圖減小從jpeg圖像轉換的base64字符串的大小。我注意到,以base64字符串包含許多重複的字符如:替換字符串中的重複字符

6qdQAUUxJA7uuCGQ8g/wA6fQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFYXiFL5b7TrmwtzM8Xmr7KWUAE +

如果有一種方法,像這樣的東西去掉重複字符,將整體小得多:

[QAUUUUAFFFFABRRR,18]

這是格式爲[反覆字符,NUMBER-OF-TIMES]。
這可能嗎?謝謝您的幫助。 :)

+0

當然,但你將不得不改變任何使用BASE64編碼的電子郵件客戶端代碼(我想這是爲了那件事)。 – Parallelis

+4

你可以嘗試壓縮它。字典的開銷可能不值得,但這基本上就是它所做的。儘管如果你打算用ASCII傳輸結果,你可能不得不調整算法來使用字符而不是位。 –

+3

由於JPEG已經在內部壓縮,您的壓縮策略將不會產生任何結果。看看文件中後面的字節,看看我的意思。 – usr

回答

1

你基本上試圖想出你自己的無損壓縮算法 - 像zip工作一樣的算法,只是按照字節而不是字符工作。

流行的壓縮算法實際上可以保證比在合理的時間內設計和實現的東西更高效。首先,由於字節對齊問題,他們可能會看到base64字符串中不明顯的模式。

那麼,爲什麼不只是使用one of them來壓縮二進制數據之前 base64編碼它,而不是其他方式呢?

1

你基本上必須創建一個搜索和替換函數。這實際上取決於重複的字符串是否具有恆定的長度。在你的例子中,重複的字符串長16個字符,所以你可以編寫一個路由來抓取前16個字符,將它們與接下來的16個字符進行比較,等等,直到找到一個不同的字符串。然後它會用你的語法替換字符串來表示它們。

如果重複字符串的長度是可變的,那麼它會更復雜一點。你基本上必須從一個簡短的字符串開始,繼續增長它,並將它與下一組相同長度的字符進行比較,如果它們重複,請檢查下一個字符等等。儘管如此,這可能會受到打擊。

對壓縮算法進行搜索,因爲其中許多算法都適用於類似的原理。

1

你可以找到最長重複的字符串。或者更好地使用Dictionary

Dictionary<char, int> rep = new Dictionary<char, int>(); 
for (int i = 0; i < str.Length; i++) 
    if (rep.ContainsKey(str[i])) rep[str[i]]++; 
    else rep.Add(str[i], 1); 

你將不得不然後用它assoicaited出現的次數每一個字符:

string total = ""; 
foreach (var item in rep) total += item.Key; 

地址

如果你真的想找到最長的重複子,那麼你應該改爲使用Dynamic Programming來解決此問題。