确定字符串是否由来自不同字符串的字符组成(类似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);
但是,这会检查它是否包含所有的字母。我想检查它是否只包含那些字母或更少,但只有那些可以由用户传递的字母组成。
如果不是因为可能存在多个字母的问题(对于"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
只出现一个字母,而测试单词有多个)