4

是否可以使用 C# 查找和替换字符串中的任何重复字符?我正在尝试减小从 jpeg 图像转换而来的 base64 字符串的大小。我注意到 base64 字符串包含许多重复的字符,例如:

6qdQAUUxJA7uuCGQ8g / wA6fQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFYXiFL5b7TrmwtzM8Xmr7KWUAE +

如果有一种方法可以用这样的方式删除重复字符,那么它总体上会小得多:

[QAUUUUAFFFFABRRR,18]

其格式为 [REPEATED-CHARACTERS, NUMBER-OF-TIMES]。
这可能吗?谢谢您的帮助。:)

4

3 回答 3

1

您基本上必须创建一个搜索和替换功能。这实际上取决于重复字符串是否具有恒定长度。在您的示例中,重复字符串的长度为 16 个字符,因此您可以编写一个获取前 16 个字符的路由,将它们与接下来的 16 个字符进行比较,依此类推,直到找到一个不同的字符串。然后它将用您的语法替换字符串来表示它们。

如果重复字符串的长度是可变的,那么它会更复杂一些。您基本上必须从一个短字符串开始,并不断增长它,并将其与下一组相同长度的字符进行比较,如果它们重复,请检查下一个字符,依此类推。不过,这可能会受到打击。

搜索压缩算法,因为它们中的许多都使用类似的原理。

于 2012-08-29T20:16:52.057 回答
1

您可以找到具有最大重复次数的最长字符串。

int mx = -1;
string str = null;
for (int i = 0; i < str.Length; i++) for (int j = i + 1; j < str.Length; j++)
{
string sub = str.Substring(i, j - i);
int tmp = countAll(str, sub); // write countAll() yourself
if (tmp > mx) { mx = tmp; str = sub; }
}

或者,更好的是,使用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);

然后,您将让每个字符与它相关联的出现次数:

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

添加

如果你真的想找到最长的重复子串,那么你应该使用动态编程来解决这个问题。

于 2012-08-29T20:52:37.913 回答
1

您实际上是在尝试提出自己的无损压缩算法 - 像 zip 这样的算法完全按照您的要求工作,除了它们适用于字节而不是字符串中的字符。

流行的压缩算法几乎可以保证比您在合理时间内设计和实现的算法更有效。一方面,由于字节对齐问题,他们可能会看到 base64 字符串中不明显的模式。

那么为什么不在base64编码之前使用它们中的一个来压缩二进制数据,而不是相反呢?

于 2012-08-29T21:09:32.290 回答