确定字符串是否由来自不同字符串的字符组成(类似scrabble的程序)

本文关键字:字符串 scrabble 程序 字符 类似 是否 | 更新日期: 2023-09-27 18:07:16

我正在用c#编写一个程序,该程序遍历单词列表并确定它们是否可以由用户输入的字符串组成。就像拼字游戏一样。

例如,当用户输入字符串"vacation"时,我的程序应该遍历我已经拥有的单词列表,并且当它到达"cat"这样的单词时应该返回true。所以它不一定要使用所有的字母。

另一个例子是单词"overflow",它应该返回true,如"over","flow","low","lover"。如果输入的单词有重复N次的字符,那么匹配的单词最多也可以有N次重复的字母,但不能超过。

我现在有这样的东西:

var desiredChars = "ent";
var word = "element";
bool contains = desiredChars.All(word.Contains);
但是,这会检查它是否包含所有的字母。我想检查它是否只包含那些字母或更少,但只有那些可以由用户传递的字母组成。

确定字符串是否由来自不同字符串的字符组成(类似scrabble的程序)

如果不是因为可能存在多个字母的问题(对于"overflow",单词"fool"是匹配的,但"wow"不是,因为字母集中没有两个w字符),这个Linq代码将工作

string letters = "overflow";
string word = "lover";
bool match = !word.Except(letters).Any(); // unfortunately, not sufficient
因此,为了处理多个字母的问题,需要这样做:
var letterChars = letters.ToList();
bool match = word.All(i => letterChars.Remove(i));

在这里,只有当单词中的所有字母都能成功地从字母集中移除时,我们才返回true。注意,您只需要在字典中检查以字母集中的一个字母开头的单词。

这对你的例子有效:

    public static bool IsWordPartOfString(string startString, string word)
    {
        var tempTable = startString.ToArray();
        foreach (var c in word)
        {
            var index = Array.FindIndex(tempTable, myChar => myChar == c);
            if (index == -1)
            {
                return false;
            }
            tempTable[index] = ' ';
        }
        return true;
    }

步骤:

1)将startString转换为数组

2)迭代测试单词

的字符

3)如果startString中没有找到char,则返回false

4)如果在startString中发现char,则在tempTable中找到它并将其移除不能重复使用(以防止startString只出现一个字母,而测试单词有多个)

如果可以遍历整个单词,这意味着它可以由初始字符串中的字母构造,因此返回true