簡體   English   中英

C#檢查字符串是否包含列表中所有重復的字符

[英]C# check if a string contains all characters in a list accounting for duplicates

如何檢查一個字符串是否可以由字符列表(或數組)中的字符組成,並且還要考慮重復的字母。

因此,假設我有字符串(或char數組/列表/任何內容)“ abcc”和字符列表(或數組/字符串/任何內容,都可以轉換為任何內容)“ ['c'],['b' ],['一種']”。 如何相互檢查這兩個值,又要說明'c'在char數組中僅存在一次,因此應該失敗。

我知道我可以使用“ .Contains”輕松完成此操作,並遍歷整個char數組,同時我可以從數組中刪除該特定字符,或者使用“ IndexOf”進行相同的操作,但是我想知道是否有辦法不從char數組中刪除任何項目。

var input = "abbc";
var validChars = new List<char>() { 'c', 'b', 'a' };
var invalidChars = validChars.Where(validChar => input.Count(inputChar => inputChar == validChar) > 1);

然后,您可以檢查invalidChars是否有任何條目。

編輯:我將保留原始回復,但是根據您的反饋,我認為這是遵循的正確程序。

首先,我認為最好將字符數組轉換為某種字典,以char作為鍵,以int作為值(告訴您有多少個字母可用)。

var charPool = new Dictionary<char, int>()
{
   { 'a', 2 },
   { 'b', 5 },
   { 'c', 5 },
   { 'd', 5 },
   { 'f', 0 },
   ...
   { 'z', 5 }
};

在這里,您可以輸入您的輸入字符串,並應用一些LINQ來根據條件過濾值。 我選擇了!charPool.ContainsKey(inputChar)charPool[inputChar] < inputWord.Count(c => c == inputChar)作為我的匹配標准。 這些基本上說明了“對於此過濾器所應用的每個字符,如果1.字典中不存在該鍵,或者2.該字典中該char的值或數量小於該char在輸入字符串,則該char無效。

給定一個輸入字符串

var inputWord = "bananafone";

以下代碼應返回字母afe的IEnumerable。 a ,因為我們需要3而只有2; f ,因為我們的條目是0,所以我們需要1; e ,因為該字母不存在任何條目。 另外,使用.Distinct()是,如果沒有.Distinct() ,則在本示例中,應用過濾器時, a將在輸入字符串中進行迭代時被輸入3次。

var charsNeeded = inputWord.Where(inputChar => !charPool.ContainsKey(inputChar) || charPool[inputChar] < inputWord.Count(c => c == inputChar)).Distinct();

請注意,這種方法的缺點是我們不計算我們擁有的字符數與需要的字符數之差。 但是,我認為實施起來並不困難。 例如,您可以輕松為輸入字符串創建另一個字典,然后將兩者進行比較。

如果要處理大量字符,並且它們全部都是ASCII字符,那么為了保持效率,我會考慮遍歷兩個字符串並計算每個字符出現的頻率。

使用您的Scrabble注釋,該怎么做:獲取輸入中每個字符的總數,並將其與允許的字符列表中相同字符的總數進行比較。 如果輸入字符串包含的字符多於允許的字符列表,則該輸入字符串無效。

private static bool ValidateString(string input)
    {
        bool retValue = true;
        char[] validChars = { 'a', 'b', 'd' };
        foreach (var character in input)
        {
            //count the number of times the character occurs in the input string
            var characterCount = input.Count(c => c == character);
            //count the number of times the character occurs in the allowed char array
            var allowedCharacterCount = validChars.Count(c => c == character);
            //if the string contains more than the character array allows, immediately fail.
            if (characterCount > allowedCharacterCount)
            {
                retValue = false;
                break;
            }

        }
        return retValue;

    }

這可能不是最有效的處理方式,尤其是在字符串有效的情況下,因為它逐字符遍歷整個字符串。 但是我認為它是有效的。

我想您可以通過轉換為char數組來創建字符串中每個字母的記號來解決此問題,如果您的情況是3整數(a,b,c)或帶有(0-25 ),其中a = 1 b = 1和c = 2然后通過與另一個數組做相同的事情進行比較,並說如果該數組對字符串的檢查值是否大於等於字符串之一的值,那么您就是很好,您可以繼續檢查b,直到檢查c值2是否大於等於其他值c = 1為止,然后得到false,所以它停止了。

您可以將搜索列表(即目標字符串中要搜索的字符列表)設為對象的數組或列表,而不僅僅是字符。 然后,您可以將與每個字符關聯的布爾值表示“ IsFoundInTarget”-這樣,您就可以“標記”每個字符而不刪除它。 最后,執行.Find(x=> x.Character == TheCharacterBeingSearchedFor && x.IsFoundInTarget == False)或類似的操作來處理多次出現的字符。

Linq並不難理解,您可以將其分解為兩個步驟

第一

//Check to see if the input values exist in the collection
var input = "abbc";
var collection = new List<char>() { 'c', 'b', 'a' };
bool doesContain = collection.Any(item => input.Contains((char)item));

dosContain將返回true

第二名

//check for duplicates in the input variable
var duplicatesList = input.GroupBy(s => s)
    .SelectMany(grp => grp.Skip(1)).ToList();

使用調試器將返回b

我們可以使用默認方法包含 var str =“ Ramesh”; str.contains(“ s”)。Count();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM