在字符串中只允许一定数量的字符
本文关键字:字符 许一定 字符串 | 更新日期: 2023-09-27 18:01:48
我正在研究一个函数,它将计算一个字符串,并且只允许每个字符的x个实例。
例如,你可以有2个字符,所以
aaaabbbbbcddddd
将被求值为
aabbcdd
到目前为止,我写的是:
public static string removeDuplicateCharacters(String text, int allowedDuplicates)
{
string seen="";
foreach (char c in text){
if(!seen.Contains(c)){
seen = seen + c;
} else if(seen.Contains(c)){
// while the sting contains < allowedDuplicates
// add c
}
}
return seen;
}
我现在还不知道如何创建一个while条件,该条件也将通过我的see字符串来计算当前正在计算的char的当前实例的数量。
使用Dictionary
跟踪字符计数的简单解决方案:
public static string removeDuplicateCharacters(String text, int allowedDuplicates)
{
string seen="";
Dictionary<char, int> charCount = new Dictionary<char, int>();
foreach (char c in text)
{
if(!charCount.ContainsKey(c))
{
seen += c;
charCount.Add(c, 1);
}
else if(charCount[c] < allowedDuplicates)
{
charCount[c] += 1;
seen += c;
}
else
{
//Reached max, do nothing
}
}
return seen;
}
这是你的基础,你可以在这里做你想要的漂亮和花哨。
。如果字符串可以变长,我建议使用StringBuilder
,因为在对它们进行+=
时,您不必分配永久的新String
。
public static string removeDuplicateCharacters(String text, int allowedDuplicates)
{
StringBuilder seen = new StringBuilder();
Dictionary<char, int> charCount = new Dictionary<char, int>();
foreach (char c in text)
{
if(!charCount.ContainsKey(c))
{
seen.Append(c);
charCount.Add(c, 1);
}
else if(charCount[c] < allowedDuplicates)
{
charCount[c] += 1;
seen.Append(c);
}
else
{
//Reached max, do nothing
}
}
return seen.ToString();
}
另一件事是,如果你想要小写和大写被同样对待。然后我将测试更改为大写或小写,但是如果您想在返回字符串中保留原始字符的大小写,您可以执行以下操作:
public static string removeDuplicateCharacters(String text, int allowedDuplicates)
{
StringBuilder seen = new StringBuilder();
Dictionary<char, int> charCount = new Dictionary<char, int>();
foreach (char c in text)
{
char upperCase = c.ToUpper();
if(!charCount.ContainsKey(upperCase))
{
seen.Append(c);
charCount.Add(upperCase , 1);
}
else if(charCount[upperCase] < allowedDuplicates)
{
charCount[upperCase ] += 1;
seen.Append(c);
}
else
{
//Reached max, do nothing
}
}
return seen.ToString();
}
自定义
使用字典跟踪字符数
public static string removeDuplicateCharacters(string text, int allowedDuplicates)
{
var frequency = new Dictionary<char, int>();
StringBuilder output = new StringBuilder();
foreach (char c in text)
{
int count = 1;
if (frequency.ContainsKey(c))
count = ++frequency[c];
else
frequency.Add(c, count);
if (count <= allowedDuplicates)
output.Append(c);
}
return output.ToString();
}
这里我们通过使用Dictionary
来跟踪看到的字符以及我们看到它们的次数,并使用StringBuilder
组合输出字符串:
public static string RemoveDuplicateCharacters(string text, int allowedDuplicates)
{
var seen = new Dictionary<char, int>();
var sb = new StringBuilder();
foreach (char c in text)
{
int count;
if (seen.TryGetValue(c, out count))
{
count++;
} else
{
count = 1;
}
seen[c] = count;
if (count <= allowedDuplicates)
sb.Append(c);
}
return sb.ToString();
}
测试:Console.WriteLine(RemoveDuplicateCharacters("aaaabbbbbcddddda", 3));
输出:aaabbbcddd
这可能是一个更适合初学者的方法。它不需要使用数组或字典,并且坚持使用简单的算法原语。(我不是反对他们的使用,我只是有一种预感,这是一个学生的练习,甚至可能是一个旨在激励他们介绍。)
public static string removeDuplicateCharacters(String text, int allowedDuplicates)
{
string seen= "";
int count = 0;
foreach (char c in text) {
count = 0;
foreach (char c2 in seen) {
if (c2 == c) count++;
}
if (count < allowedDuplicates) {
seen = seen + c;
}
}
return seen;
}