在javascript中创建anagrams生成器,只查找列表中包含的单词

时间:2014-06-06 15:11:49

标签: javascript anagram

我试图在javascript中改进这个anagrams生成器:

JS:

var str,re,cnt,cntmax;

function rst(){
    cnt=0; cntmax=10000; str="";
    if (document.forms[0].re.value != ""){
        re=new RegExp(document.forms[0].re.value);
    } else { re=null; }
}

function go(prefix, postfix){
    if (cnt>=cntmax) return;
    if (postfix==""){
        if (re==null || prefix.match(re)==null){
            str+=prefix+"\r\n"; cnt++;
        }
        return;
    }
    for (var i=0;i<postfix.length;i++){
        var prefix2=prefix+postfix.charAt(i);
        var postfix2=postfix.substring(0,i)+postfix.substring(i+1);
        go(prefix2,postfix2);
    }
}

HTML:

<form>
Anagram this word:<input type="text" name="t" /> <br>
Exclude these pat:<input type="text" name="re" /> <br>
<input type="button" value="Generate anagrams (max 10000)"
onClick="javascript: rst(); go('', t.value); tout.value=str; console.log('Anagrams: '+cnt);" />
<br>
<textarea name="tout" rows=10 cols=40></textarea>
</form>

要修复一些问题,例如需要单词分隔符(如拆分)来排除单词,
但最重要的是让生成器只找到列表中收集的单词(如数据库)...... 我不知道如何创建该列表,请帮助......

DEMO HERE

1 个答案:

答案 0 :(得分:1)

根据单词列表的大小,您可能最好使用可以访问数据库的服务器端代码来实现它。但是,假设您真的想使用javascript客户端,我会回答您的问题。

最简单的方法是只有一个单词数组并检查每个字符串是否包含在列表中。如果想要更好的性能,可以预先分配它并使用二进制搜索,但这个例子只使用简单的线性搜索。

   var dictionary = [
     "apple",
     "banana",
     "orange",
     "pear",
     "watermelon"
   ];

   function isValidWord(word) {
     for(var i = 0, n = dictionary.length; i < n; i++) {
       if(word === dictionary[i]) {
         return true;
       }
     }
     return false;
   }

然后你改变这一行:

   if (re==null || prefix.match(re)==null){

到此:

   if ((re==null || prefix.match(re)==null) && isValidWord(prefix) ){

现在,正如我所提到的,这可能是一个非常大字典的性能问题。想象一下,你的词典有一百万字,你正在寻找一个4个字母的单词。你得到的排列数是24,所以它需要搜索字典24次。如果在中间找到平均单词,则进行1200万次比较。呸!如果这对您来说是个问题,请阅读二进制搜索算法。

虽然,如果字典很大,那么还需要将整个事物发送到客户端。你可以使用某种拉链算法减少一点,但即便如此,它可能只是太多了。此时,您可能希望使用服务器端的字谜检查器并发回结果。

另外需要注意的一点是,你应该将你的字谜列表构建成一个数组,扔出任何不好的字符串,然后确保删除任何重复项。您会注意到我提供的代码&#34; baaann&#34;提出了大量重复的&#34; banana&#34;。这是因为您创建排列的算法并没有考虑重复的字母。