在字符串中只允许一定数量的字符

本文关键字:字符 许一定 字符串 | 更新日期: 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; 
}