Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 列表置换_Javascript_String_Permutation_Combinations - Fatal编程技术网

Javascript 列表置换

Javascript 列表置换,javascript,string,permutation,combinations,Javascript,String,Permutation,Combinations,我试图列出所有三个字母的排列,这是我的代码- window.permute = function(){ var alphabet = "abcdefghijklmnopqrstuvwxyz"; var searchTerm ="aaa"; var position = 2; changeString(searchTerm, position); } window.changeString = function(searchTerm, position){

我试图列出所有三个字母的排列,这是我的代码-

  window.permute = function(){
    var alphabet = "abcdefghijklmnopqrstuvwxyz";
    var searchTerm ="aaa";
    var position = 2; 
    changeString(searchTerm, position); 
}

window.changeString = function(searchTerm, position){
    if (position <0){
        alert(newString);

    return; 
    }
    var alphabet = "abcdefghijklmnopqrstuvwxyz"
    for (j=0; j < 26;j++){
        var newString = searchTerm.substr(0, position) + alphabet[j] + searchTerm.substr(position+1);
        var newPosition = position -1; 
        changeString(newString,newPosition);
    }
    return;
}
它不起作用,我也不知道为什么——有人能帮忙吗

alert(newString);
这里没有定义newString。相反,您应该使用传递的参数:

alert(searchTerm);
编辑:我不完全确定你的方法。这似乎太复杂了。这似乎奏效了。我知道您宁愿自己编写代码,但这可能有助于解决问题。我不太明白你的意思

应该是

for (var j=0; j<26; j++) {

如果没有声明,j是一个全局变量,因此只需要一次迭代就可以达到26,然后所有循环都会终止。

从您的问题中,我不确定您指的是置换,因为置换通常不包括重复的元素,看起来您希望包括aaa

以下是你可以去查看的排列列表。如果你的意思是重复,那么看起来pimvdb已经涵盖了你

编辑:这样您就知道在运行时会得到什么:

重复aaa,aab,…:n^k=26^3=17576 没有重复abc,bac,…:n/n-k!=26!/26-3! = 15,600
对于置换,pimvd显示的递归算法总是不错的,但不要忘记,当N很小时,您可以使用For循环强制执行它:

for(int x1=0; x1 < 26; x1++)
for(int x2=0; x2 < 26; x2++)
for(int x3=0; x3 < 26; x3++){
    //do something with x1, x2, x3
}
有关更多信息,请访问 对于一个工作示例,请检查C中的JSFIDLE:

    void DoPermuation(string s)
    {
        var pool = new HashSet<string>();
        //Permute("", , pool);
        pool = Permute(new List<char>(s));
        int i = 0;
        foreach (var item in pool) Console.WriteLine("{0:D2}: {1}", ++i, item);      
    }

    HashSet<string> Permute(List<char> range)
    {
        if (range.Count == 1) return new HashSet<string>(new string[] { range[0].ToString() });

        var pool = new HashSet<string>();
        foreach (var c in range)
        {             
            var list = new List<char>(range);
            list.Remove(c);
            foreach (var item in Permute(list)) pool.Add(c + item);                
        }

        return pool;
    }

你能提供更多的上下文吗?呃,现在我只需要更改第一个字母-我需要所有的排列。这可能重要,也可能不重要,但你要知道你要做的是生成26/26-3! = 15600个字符串。*facepalm-尽管如此,我只改变了第一个字母,这意味着其中一个返回没有做我想做的事情。你要做的是a,而不是排列。@pimvdb:他可能想要电源,如果是这样的话,那是一个微不足道的2^26=67108864字符串…等等-那会有区别吗?-为什么控制台中没有错误?@scubadiver哦,是的,你不知道自动全局声明的效果有多微妙,它也不在组合中。集合的组合是一组排列的集合,不考虑顺序,而不是替换集合中的排列。没错,我滥用了定义,我把它扔掉了,只是使用了有重复和无重复的排列。假设需要C的答案,这会在问题中指出。
for (var j=0; j<26; j++) {
for(int x1=0; x1 < 26; x1++)
for(int x2=0; x2 < 26; x2++)
for(int x3=0; x3 < 26; x3++){
    //do something with x1, x2, x3
}
var permutate = (function() {
    var results = [];    
    function doPermute(input, output, used, size, level) {        
        if (size == level) {
            var word = output.join('');
            results.push(word);
            return;
        } 
        level++;
        for (var i = 0; i < input.length; i++) {
            if (used[i]) {
                continue;
            }            
            used[i] = true;
            output.push(input[i]);
            doPermute(input, output, used, size, level);
            used[i] = false;
            output.pop();
        }
    }

    return {
        getPermutations: function(input, size) {
            var chars = input.split('');
            var output = [];
            var used = new Array(chars.length);      
            doPermute(chars, output, used, size, 0);        
            return results;    
        }
    }
})();
    void DoPermuation(string s)
    {
        var pool = new HashSet<string>();
        //Permute("", , pool);
        pool = Permute(new List<char>(s));
        int i = 0;
        foreach (var item in pool) Console.WriteLine("{0:D2}: {1}", ++i, item);      
    }

    HashSet<string> Permute(List<char> range)
    {
        if (range.Count == 1) return new HashSet<string>(new string[] { range[0].ToString() });

        var pool = new HashSet<string>();
        foreach (var c in range)
        {             
            var list = new List<char>(range);
            list.Remove(c);
            foreach (var item in Permute(list)) pool.Add(c + item);                
        }

        return pool;
    }