我正在用C#编写一个程序,它通过一个单词列表来确定它们是否可以由用户输入的字符串组成。就像Scrabble游戏一样。
例如,当用户输入字符串“vacation”时,我的程序应该通过我已经拥有的单词列表,并且当它到达像“cat”这样的单词时应该返回true。所以它不一定要用户所有的字母。
另一个例子可能是“溢出”这个词,它应该用“over”,“flow”,“low”,“lover”等词语返回true。如果输入的单词具有N次重复字符,则匹配的单词也可以具有N次但不多的字母。
我目前有这样的事情:
var desiredChars = "ent";
var word = "element";
bool contains = desiredChars.All(word.Contains);
但是,这会检查它是否包含所有字母。我想检查它是否只包含那些字母或更少但只包含那些可以用用户传递的字母组成的字母。
答案 0 :(得分:0)
如果不是可能出现多个字母的问题(对于"溢出",单词"傻瓜"是匹配,但"哇&#34 ;不是,因为字母集中没有两个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。请注意,您只需要检查字典中以字母集中的一个字母开头的单词。
答案 1 :(得分:0)
这适用于你的例子:
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
中找到的字符在tempTable
中找到,则将其删除
无法重复使用(以防止startString
只出现一次字母但测试字有多个时出现的情况)
5)如果可能迭代整个单词,则意味着它可以从初始字符串中的字母构造,因此返回true。