2012-08-29 29 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来解决此问题。