替换字符串中的重复字符

时间:2012-08-29 20:08:33

标签: c# string

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

  

6qdQAUUxJA7uuCGQ8g / wA6fQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFYXiFL5b7TrmwtzM8Xmr7KWUAE +

如果有办法用这样的东西删除重复的字符,那么它总体上要小得多:

  

[QAUUUUAFFFFABRRR,18]

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

3 个答案:

答案 0 :(得分:1)

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

如果重复字符串的长度是可变的,那么它会更复杂一些。你基本上必须从一个短字符串开始,并继续增长它,并将它与下一组相同长度的字符进行比较,如果它们重复,检查下一个字符串,依此类推。但这可能会被击中和遗漏。

搜索压缩算法,因为其中许多算法都适用于类似的主体。

答案 1 :(得分: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;

添加

如果你真的想找到最长的重复子字符串,那么你应该使用Dynamic Programming来解决这个问题。

答案 2 :(得分:1)

你实际上是在尝试提出自己的无损压缩算法 - 像拉链一样的算法,完全按照你要求的方式工作,除了它们工作在字节而不是字符串中的字符。

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

那么为什么不在 base64-encoding之前使用one of them来压缩二进制数据,而不是相反呢?