Java Strings&这些字符串的可能字谜

Java Strings&这些字符串的可能字谜,java,string,recursion,arraylist,anagram,Java,String,Recursion,Arraylist,Anagram,我正在用Java做一个wee项目,而uni只是为了测试自己,我遇到了一个绊脚石 我试图编写一个程序,从文本版本的字典中读取数据,存储在ds数据结构中,然后要求用户输入一个随机字符串,最好是一个无意义的字符串,但只有字母和-,没有数字或其他标点符号-我对其他任何东西都不感兴趣,找出输入字符串的所有字谜,将其与字典ds进行比较,并返回字典中所有可能的字谜的列表 好的,对于第1步和第2步阅读字典,当我阅读字典中的所有内容时,我将其存储在一个地图中,其中键是字母表中的字母,值是存储以该字母开头的所有单词

我正在用Java做一个wee项目,而uni只是为了测试自己,我遇到了一个绊脚石

我试图编写一个程序,从文本版本的字典中读取数据,存储在ds数据结构中,然后要求用户输入一个随机字符串,最好是一个无意义的字符串,但只有字母和-,没有数字或其他标点符号-我对其他任何东西都不感兴趣,找出输入字符串的所有字谜,将其与字典ds进行比较,并返回字典中所有可能的字谜的列表

好的,对于第1步和第2步阅读字典,当我阅读字典中的所有内容时,我将其存储在一个地图中,其中键是字母表中的字母,值是存储以该字母开头的所有单词的数组列表

我一直在寻找所有的字谜,我很自豪地想到了如何递归地计算可能的排列数,我不知道如何进行实际的重新排列

将其拆分为char并以这种方式使用,还是将其拆分并作为字符串元素保留?我在不同的网站上看到过示例代码,但我不想看到代码,我想知道开发解决方案背后的方法/想法,因为我有点被困于如何开始:

我的意思是,我想我知道一旦我生成了所有排列,我将如何与字典ds进行比较

任何建议都会很有帮助,但如果没问题的话,就不要编写代码,只要一些想法


另外,如果您出于任何原因想查看我的代码,我将发布我的代码。

在这种情况下,计算排列似乎是个坏主意。例如,单词overflow有40320个排列


找出一个单词是否是另一个单词的排列的更好方法是计算每个字母出现的次数,它将是一个26元组,并将这些元组相互比较。

如果您给出一个示例来澄清这个问题,可能会有所帮助。据我所知,您的意思是,如果用户输入islent,程序将使用listen、silent和include进行回复

我认为最简单的解决办法是把每个单词都放在字典里,并与输入的单词和按字母顺序排列的单词一起存储。让我们称之为规范值。基于规范值的索引。然后将输入转换为规范值,并直接搜索匹配项

为了继续上面的例子,当我们构建dictionary并看到单词listen时,我们会将其转换为eilnst并存储eilnst->listen。我们还将存储eilnst->silent和eilnst->enlist。然后我们得到输入字符串,将其转换为eilnst,进行搜索并立即找到三个匹配项

public String str = "overflow";
public ArrayList<String> possibilities = new ArrayList<String>();
public void main(String[] args)
{
    permu(new boolean[str.length()],"");
}
public void permu(boolean[] used, String cur)
{
    if (cur.length()==str.length())
    {
        possibilities.add(cur);
        return;
    }
    for (int a = 0; a < str.length(); a++)
    {
        if (!used[a])
        {
            used[a]=true;
            cur+=str.charAt(a);
            permu(used,cur);
            used[a] = false;
            cur = cur.substring(0,cur.length()-1);
        }
    }
}
简单,运行时非常糟糕,但可以完成任务

编辑:更高级的版本称为Dictionary Trie。基本上,它是一棵树,其中每个节点有26个节点,字母表中的每个字母对应一个节点。每个节点都有一个布尔值来判断它是否是一个单词的结尾。使用此功能,您可以轻松地将单词插入词典,并轻松检查您是否在创建单词的正确路径上


如果您愿意,我将粘贴代码

您实际上是在编写一个字谜解算器。我知道最好的方法是使用某种树结构。“但我不是100%确定该怎么做。”杰夫·福斯特:是的,在反思中,我指的是字谜!该死的,我甚至想不起那个词:/现在就需要转载这个。谢谢真的是一棵树来解决吗?这是怎么回事?它叫字典,我得为CMU的暑期班写一本,真的很简单。你的后台数据结构是非常重要的一部分。哈!直到后来我才真正理解你的意思:P以为你的意思是说树,然后错了:P谢谢:好吧,我的坏,我不是说所有的排列都应该说清楚,我只对所有长度相同的字符串的排列感兴趣,词典中所有可以由overflow构成的单词,其长度与overflow相同,你是什么意思?所有的排列显然都有相同的长度。我只是想说清楚,我不希望单词比原来的单词小。好的,那么在字典中查找包含搜索字符串中所有字母的单词?没错。计算输入字符串的所有排列很可能是不可行的。谢谢,这是一个很好的建议,但在273000个单词中查找包含它的所有单词,而不是生成40320个字谜,并通过适当的字母进行二进制搜索以检查其中是否有?当然,我可以根据英语语言规则制定规则,丢弃某些字谜,但在字典中查找包含所有字母的单词时,没有特定的顺序
orse不是吗?和你的差不多,比如如果我有溢出,我会把英语词典中的所有单词都从长度为8eg的字符串中提取出来,与搜索词的长度相同。例如,我得到了ckod,我可以将dock作为输出之一,但kodc不会是输出,因为它不在词典中。非常多!我现在有几件事要尝试,非常感谢你的建议,非常有用!一个更好的应用是字典trie,在这个字典trie中,你可以获取每个字符,并在继续该路径之前遍历trie以查看前缀是否存在。谢谢!只是寻找一些想法,虽然没有任何实际的代码,但感谢所有的努力一样+事实上,对于树的想法,我是这么想的。把它作为便条放在你的帖子里!不,没关系,不需要代码,我自己做研究谢谢:D,我把它拿走,然后再做!非常感谢您的大力支持!:D再次感谢!