弦乐&这些字符串的可能字谜

时间:2011-06-08 15:41:31

标签: java string recursion arraylist anagram

我正在做一个小型项目(用Java),而uni只是为了测试自己而且我遇到了绊脚石。

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

好的,对于第1步和第2步(从字典中读取),当我正在读取所有内容时,我将其存储在Map中,其中键是字母表的字母,值是存储所有单词的ArrayLists那封信。

我一直在寻找所有的字谜,我想到如何递归地(自豪地)计算可能的排列数量,我不确定如何实际进行重新排列。

最好将它分解为char并以这种方式玩它,或将它拆分并保持为字符串元素?我在不同的网站上看过网上的示例代码,但我不想看代码,我想知道为此开发解决方案背后的方法/想法,因为我有点困难甚至开始:(

我的意思是,我想我知道在生成所有排列后,我将如何与词典ds进行比较。

任何建议都会有所帮助,但不是代码,如果那样好,只是想法。

P.S。如果你想看到我的代码到目前为止(无论出于何种原因),我会发布我已经发布的内容。

3 个答案:

答案 0 :(得分:4)

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);
        }
    }
}

简单的运行时非常糟糕,但它可以完成工作。

编辑:更高级的版本称为词典Trie。基本上它是一棵树,其中每个节点有26个节点,每个节点对应字母表中的每个字母。每个节点还有一个布尔值,告诉它是否是一个单词的结尾。通过这种方式,您可以轻松地将单词插入字典中,并轻松检查您是否在创建单词的正确路径上。

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

答案 1 :(得分:3)

在这种情况下,计算排列看起来确实是一个坏主意。单词&#34;溢出&#34;例如,有40320个排列。

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

答案 2 :(得分:2)

如果您举一个例子来澄清问题可能会有所帮助。据我所知,你说如果用户输入“islent”,程序会以“listen”,“silent”和“enlist”回复。

我认为最简单的解决方案是将字词中的每个单词与输入的单词一起存储,并将单词与字母重新排列为字母顺序。我们称之为“规范价值”。规范值的索引。然后将输入转换为规范值,并直接搜索匹配。

为了追求上面的例子,当我们建立dictinoary并看到“listen”这个词时,我们会把它翻译成“eilnst”并存储“eilnst - &gt; listen”。我们还会存储“eilnst - &gt; silent”和“eilnst - &gt; enlist”。然后我们得到输入字符串,将其转换为“eilnst”,进行搜索并立即找到三个命中。