在javascript中生成字谜生成器,只查找列表中包含的单词

在javascript中生成字谜生成器,只查找列表中包含的单词,javascript,anagram,Javascript,Anagram,我正试图用javascript改进这个字谜生成器: JS: var-str、re、cnt、cntmax; 函数rst(){ cnt=0;cntmax=10000;str=“”; if(document.forms[0].re.value!=“”){ re=new RegExp(document.forms[0].re.value); }else{re=null;} } 函数go(前缀、后缀){ 如果(cnt>=cntmax)返回; 如果(后缀==“”){ if(re==null | | pref

我正试图用javascript改进这个字谜生成器:

JS:

var-str、re、cnt、cntmax;
函数rst(){
cnt=0;cntmax=10000;str=“”;
if(document.forms[0].re.value!=“”){
re=new RegExp(document.forms[0].re.value);
}else{re=null;}
}
函数go(前缀、后缀){
如果(cnt>=cntmax)返回;
如果(后缀==“”){
if(re==null | | prefix.match(re)==null){
str+=前缀+“\r\n”cnt++;
}
返回;
}

对于(var i=0;i,根据单词列表的大小,您最好使用服务器端代码实现,在服务器端代码中您可以访问数据库

最简单的方法是使用一个单词数组并检查列表中是否包含每个字符串。如果希望获得更好的性能,您可以对其进行预排序并使用二进制搜索,但本例将只使用简单的线性搜索

   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) && isValidWord(prefix) ){
现在,正如我提到的,这可能是一个非常大的字典的性能问题。假设你的字典有一百万个单词,而你正在寻找一个4个字母的单词。你得到的排列数是24,因此它需要在字典中搜索24次。如果平均单词在中间,那就是1200万个恶心!如果这是你的问题,请阅读二进制搜索算法

虽然,如果字典那么大,也有一个问题,那就是您需要将整个内容发送到客户端。您可以使用某种zip算法来减少这一点,但即使这样,它也可能太多了。在这一点上,您可能需要使用服务器端的字谜检查器并返回结果


另一件需要注意的事情是,你应该将你的字谜列表构建成一个数组,扔掉任何不好的字谜,然后确保删除任何重复的字谜。你会注意到我提供的代码“baaann”提供了大量重复的“banana”。这是因为创建排列的算法不考虑重复字母。

谢谢您的帮助,您知道如何为排除的单词添加分隔符吗?它现在只接受一个单词…您可能希望使用类似的方式。您需要遍历每个单词,因为它返回一个数组,但这至少会根据逗号分隔符(或任何您想要的其他分隔符)点亮单词.我尝试过使用split,但仍然无法使其工作..我是javascript新手,对于meCheck out来说有点困难。我最终将其分解为更多函数,以便您可以看到如何将此类问题分解为更小、更易于管理的单元。希望这能帮助您学习使用JS解决此类问题的一些方法。
   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) ){