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