Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定字符串是否由来自不同字符串的字符组成(类似拼字的程序)_C#_String_Char - Fatal编程技术网

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

C# 确定字符串是否由来自不同字符串的字符组成(类似拼字的程序),c#,string,char,C#,String,Char,我正在用C语言编写一个程序,它将遍历一系列单词,并确定它们是否可以由用户输入的字符串组成。就像拼字游戏一样 例如,当用户输入字符串“vacation”时,我的程序应该遍历我已经拥有的单词列表,当它到达像“cat”这样的单词时,应该返回true。所以它不一定要使用所有的字母 另一个例子可能是单词“overflow”,它应该返回true,比如“over”、“flow”、“low”、“lover”。如果输入字有N次重复字符,则匹配的字也可以有N次重复字符,但不能超过N次 我现在有这样的东西: var

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

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

另一个例子可能是单词“overflow”,它应该返回true,比如“over”、“flow”、“low”、“lover”。如果输入字有N次重复字符,则匹配的字也可以有N次重复字符,但不能超过N次

我现在有这样的东西:

var desiredChars = "ent";
var word = "element";
bool contains = desiredChars.All(word.Contains);

但是,这会检查它是否包含所有字母。我想检查它是否只包含那些或更少的字母,但只包含那些可以由用户传递的字母组成的字母。

如果不是因为可能存在多个字母的问题(对于“溢出”,单词“傻瓜”是匹配的,但“哇”不是匹配的,因为字母集中没有两个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。请注意,您只需要检查字典中以字母集中的一个字母开头的单词。

如果不是因为可能出现多个字母的问题(对于“溢出”,单词“傻瓜”是匹配的,但是“哇”不是匹配的,因为字母集中没有两个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
中未找到字符,则返回false

4) 如果在
startString
中找到char,请在
tentable
中找到它并删除它 无法重复使用(以防止出现
startString
一个字母只出现一次,而测试单词出现多次的情况)


5) 如果可以遍历整个单词,这意味着可以从初始字符串中的字母构造所有单词,因此返回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
中未找到字符,则返回false

4) 如果在
startString
中找到char,请在
tentable
中找到它并删除它 无法重复使用(以防止出现
startString
一个字母只出现一次,而测试单词出现多次的情况)


5) 如果可以遍历整个单词,这意味着可以从初始字符串中的字母构造所有单词,因此返回true。

谢谢!其实我也试过类似的方法。我把它分解成一个列表/枚举,并在上面做了intersect,但这个逻辑不起作用。这种逻辑非常清晰,也很容易理解。谢谢非常感谢。其实我也试过类似的方法。我把它分解成一个列表/枚举,并在上面做了intersect,但这个逻辑不起作用。这种逻辑非常清晰,也很容易理解。谢谢