根据提供的字母从字典中查找最长的单词 C#


大家好,请并需要您的帮助。
我在 Windows 窗体上有三个文本框:
– 在tetxBox1.Text中有一个包含很多单词的字典(最长的单词
有12个字母)
– textBox2.Text 中始终提供 12 个字母
– 在textBox3.Text中,我希望结果是textBox1中最长的单词
由 textBox2 提供的字母组成

例如:

在 textBox1.Text 我有以下文字:

characters
character
charity
act
acter
acted
successfully
wind
succession
windy
successful
window
windows
success
excellent
excel
excellence
excellency

在 textBox2.Text 中,我提供了以下 12 个字母:

桉树油

在 textBox3.Text 中,我希望结果是 textBox1.Text 中最长的单词比 textBox2.Text 中的字母最长:

成功地

如果可能的话,我请求您的帮助,一些解决方案……
我希望你能理解我,如果你听不懂,我为我的英语道歉。
谢谢大家。

https://i.postimg.cc/HnS59c2R/Capture.png[^]

我尝试过的:

C#
static bool isSubSequence(String str1,
                                String str2)
        {
            int m = str1.Length, n = str2.Length;

            int j = 0; 

            for (int i = 0; i < n && j < m; i++)
            {
                if (str1[j] == str2[i])
                {
                    j++;
                }
            }
            return (j == m);
        }


static String findLongestString(List<String> dict,
                                            String str)
        {
            String result = "";
            int length = 0;
            foreach (String word in dict)
            {
                if (length < word.Length &&
                    isSubSequence(word, str))
                {
                    result = word;
                    length = word.Length;
                }
            }

            return result;
        }

private void btnfind_Click(object sender, EventArgs e)
        {
            String[] arr = textBox1.Lines;
            List<String> dict = new List<String>(arr);
            String str = textBox2.Text;
            textBox3.Text = (findLongestString(dict, str));
        }

解决方案1

考虑任务而不是解决方案:您需要找到具有共同字母的最长匹配单词集。 因此,首先要做两件事:构建一个字符映射表(包括“A”到“Z”在内,只有 26 种可能)并计算“检查字母”和单个单词的数量。
因此,您的示例“euclsfcysuls”映射到:

A 0
B 0
C 2
D 0
E 1
F 1
G 0
H 0
I 0
J 0
K 0
L 2
M 0
N 0
O 0
P 0
Q 0
R 0
S 3
T 0
U 2
V 0
W 0
X 0
Y 1
Z 0

这很简单:通过一个单词来计算字母数。 编写一个方法来做到这一点并彻底测试它。

现在这是一个更简单的问题:对于每个要检查的单词,通过比较字母计数来查找有多少匹配项:如果“可能的单词”的字母计数大于相同的“检查单词”字母,则它不匹配。

当您浏览时,保留“迄今为止最长”的单词,当您找到可能的匹配项时,将其与“迄今为止最长”的单词进行比较,并根据需要进行更新。

最后,您将获得最长的比赛。

解决方案2

我的建议是将目标字符串中的所有字母分组到一个元组集合中,其中每个元组都包含一个字母和该字母出现的总数。 有一个 linq 方法可以做到这一点。

C#
string target = "euclsfcysuls";
//group all the letters into a collection of tuples char key and key count
IEnumerable<(char Key, int count)> resultCollection = target.GroupBy(c => c).Select(g => (g.Key, g.Count()));

迭代集合并将每个键和字母计数添加到字典中。 现在,对于测试集合中的每个字符串,以与之前相同的方式对字母进行分组,但这次迭代测试字符串组。 如果目标字典中不存在关键字母,或者某个字母的重复次数多于目标字符串中的重复次数,则不匹配。 相关代码就是这样的。

C#
bool isSuccessful = true;
foreach (var (key, count) in testCollection)
{
    //there is no match if the key char is not present in the target dict or
    //there are more repetitions of a letter  than in the target string
    if (targetDict.ContainsKey(key) is false || targetDict[key] < count)
    {
        isSuccessful = false;
        break;
    }
}
if (isSuccessful)
{
    matchedList.Add(testString);
}

现在所有成功的匹配都在匹配列表中。 按字符串长度降序对列表进行排序。 获胜者是列表中的第一个条目。

コメント

タイトルとURLをコピーしました