[ad_1]
大家好,请并需要您的帮助。
我在 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[^]
我尝试过的:
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 方法可以做到这一点。
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()));
迭代集合并将每个键和字母计数添加到字典中。 现在,对于测试集合中的每个字符串,以与之前相同的方式对字母进行分组,但这次迭代测试字符串组。 如果目标字典中不存在关键字母,或者某个字母的重复次数多于目标字符串中的重复次数,则不匹配。 相关代码就是这样的。
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); }
现在所有成功的匹配都在匹配列表中。 按字符串长度降序对列表进行排序。 获胜者是列表中的第一个条目。
[ad_2]
コメント