搜索字符串数组是否包含数组if char';s
本文关键字:数组 char if 字符串 是否 包含 搜索 | 更新日期: 2023-09-27 18:00:22
目前我正在处理一个小项目,这是一个倒计时类型的游戏(电视节目)。目前,该程序允许用户选择一个元音或辅音,最多只能选择9个字母,然后要求用户输入他们能想到的使用这9个字母的最长单词。
我有一个充当词典的大文本文件,我使用用户输入的字符串进行搜索,试图匹配结果,以检查他们输入的单词是否是有效的单词。我的问题是,我想在字典里搜索由九个字母组成的最长单词,但我似乎找不到实现它的方法
到目前为止,我已经尝试将每个单词放入一个数组中,并在每个元素中搜索,以检查它是否包含字母,但如果9个字母中最长的单词是8个字母的单词,我就无法理解了。有什么想法吗?目前我有这个(这是在表单上的提交按钮下,很抱歉没有提供代码或提到这是一个windows表单应用程序):
StreamReader textFile = new StreamReader("C:/Eclipse/Personal Projects/Local_Projects/Projects/CountDown/WindowsFormsApplication1/wordlist.txt");
int counter1 = 0;
String letterlist = (txtLetter1.Text + txtLetter2.Text + txtLetter3.Text + txtLetter4.Text + txtLetter5.Text + txtLetter6.Text + txtLetter7.Text + txtLetter8.Text + txtLetter9.Text); // stores the letters into a string
char[] letters = letterlist.ToCharArray(); // reads the letters into a char array
string[] line = File.ReadAllLines("C:/Eclipse/Personal Projects/Local_Projects/Projects/CountDown/WindowsFormsApplication1/wordlist.txt"); // reads every line in the word file into a string array (there is a new word on everyline, and theres 144k words, i assume this will be a big performance hit but i've never done anything like this before so im not sure ?)
line.Any(x => line.Contains(x)); // just playing with linq, i've no idea what im doing though as i've never used before
for (int i = 0; i < line.Length; i++)// a loop that loops for every word in the string array
// if (line.Contains(letters)) //checks if a word contains the letters in the char array(this is where it gets hazy if i went this way, i'd planned on only using words witha letter length > 4, adding any words found to another text file and either finding the longest word then in this text file or keeping a running longest word i.e. while looping i find a word with 7 letters, this is now the longest word, i then go to the next word and it has 8 of our letters, i now set the longest word to this)
counter1++;
if (counter1 > 4)
txtLongest.Text+=line+Environment.NewLine;
Mike的代码:
using System;
使用System.Collections.Generic;使用System.Linq;
类程序
static void Main(string[] args) {
var letters = args[0];
var wordList = new List<string> { "abcbca", "bca", "def" }; // dictionary
var results = from string word in wordList // makes every word in dictionary into a seperate string
where IsValidAnswer(word, letters) // calls isvalid method
orderby word.Length descending // sorts the word with most letters to top
select word; // selects that word
foreach (var result in results) {
Console.WriteLine(result); // outputs the word
}
}
private static bool IsValidAnswer(string word, string letters) {
foreach (var letter in word) {
if (letters.IndexOf(letter) == -1) { // checks if theres letters in the word
return false;
}
letters = letters.Remove(letters.IndexOf(letter), 1);
}
return true;
}
}
这是我在几分钟内找到的答案,应该可以满足您的需求。正如其他人所说,这个问题很复杂,因此算法会很慢。LINQ查询评估字典中的每个字符串,检查提供的字母是否可以用于生成所述单词。
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args) {
var letters = args[0];
var wordList = new List<string> { "abcbca", "bca", "def" };
var results = from string word in wordList
where IsValidAnswer(word, letters)
orderby word.Length descending
select word;
foreach (var result in results) {
Console.WriteLine(result);
}
}
private static bool IsValidAnswer(string word, string letters) {
foreach (var letter in word) {
if (letters.IndexOf(letter) == -1) {
return false;
}
letters = letters.Remove(letters.IndexOf(letter), 1);
}
return true;
}
}
那么你被困在哪里了?从慢速暴力方法开始,只需找到包含所有字符的所有单词。然后按单词的长度排序,得到最长的单词。如果你不想返回一个比要查找的字符数短的单词(我想这只是在有重复字符的情况下的问题???),那么添加一个测试并消除这种情况。
我对此有了更多的想法。我认为有效的方法是预处理字典,按字母顺序排列每个单词中的字母,并按字母顺序排序列表中的单词(你可能需要使用某种多映射结构来存储原始单词和排序后的单词)。
一旦你做到了这一点,你就可以更有效地从你的字母库中找到可以生成的单词。如果其他人没有打败我,我稍后会回来完善一个算法。
步骤1:构建一个trie结构,每个单词按字母排序。
示例:EACH排序为ACEH在trie中存储为A->C->E->H->(EACH,ACHE,..)(ACHE是EACH的变位词)。
第二步:对输入的字母进行排序,找到与trie中的那组字母对应的最长单词。
您尝试过实现这样的东西吗?如果能看到您尝试过的代码,那就太好了。
string[] strArray = {"ABCDEFG", "HIJKLMNOP"};
string findThisString = "JKL";
int strNumber;
int strIndex = 0;
for (strNumber = 0; strNumber < strArray.Length; strNumber++)
{
strIndex = strArray[strNumber].IndexOf(findThisString);
if (strIndex >= 0)
break;
}
System.Console.WriteLine("String number: {0}'nString index: {1}",
strNumber, strIndex);
这必须完成以下工作:
private static void Main()
{
char[] picked_char = {'r', 'a', 'j'};
string[] dictionary = new[] {"rajan", "rajm", "rajnujaman", "rahim", "ranjan"};
var words = dictionary.Where(word => picked_char.All(word.Contains)).OrderByDescending(word => word.Length);
foreach (string needed_words in words)
{
Console.WriteLine(needed_words);
}
}
输出:
rajnujaman
ranjan
rajan
rajm