列出排列

时间:2011-08-29 18:35:31

标签: javascript string permutation combinations

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

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

它没有用,我不知道为什么 - 有人可以帮忙吗?

6 个答案:

答案 0 :(得分:4)

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

有关详细信息,请访问http://jinwolf.tumblr.com/post/26476479113/draw-something-cheat 对于一个工作示例,请检查此jsfiddle http://jsfiddle.net/jinwolf/Ek4N5/31/

答案 1 :(得分:1)

alert(newString);

newString没有在那里定义。相反,您应该使用传递的参数:

alert(searchTerm);

编辑:我不完全确定您的做法。看起来过于复杂。这似乎有效。我知道您宁愿使用自己的代码,但这可能有助于您解决问题。我不太了解你的substr部分。

http://jsfiddle.net/NUG2A/2/

var alphabet = "abc"; // shortened to save time

function permute(text) {
    if(text.length === 3) { // if length is 3, combination is valid; alert
        console.log(text); // or alert
    } else {
        var newalphabet = alphabet.split("").filter(function(v) {
            return text.indexOf(v) === -1;
        }); // construct a new alphabet of characters that are not used yet
            // because each letter may only occur once in each combination

        for(var i = 0; i < newalphabet.length; i++) {
            permute(text + newalphabet[i]); // call permute with current text + new
                                            // letter from filtered alphabet
        }
    }
}

permute("");

这将导致以下内容被调用:

permute("");
permute("a");
permute("ab");
permute("abc"); // alert
permute("ac");
permute("acb"); // alert
permute("b");
// ...

答案 2 :(得分:1)

我不确定你的问题是什么意思是“排列”,因为通常排列不包括重复的元素,看起来你想要包含“aaa”。

以下several algorithms列出了您可以查看的排名。如果事实证明你的意思是重复,那看起来就像pimvdb一样。

编辑:所以你知道你在运行时间方面的进展:

  • 重复(aaa,aab,...):n ^ k = 26 ^ 3 = 17,576
  • 不重复(abc,bac,......):n!/(n-k)! = 26!/(26-3)! = 15,600

答案 3 :(得分:0)

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

应该是

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

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

答案 4 :(得分:0)

对于排列,显示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
}

答案 5 :(得分:-3)

在C#中:

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