我正在尝试列出所有三个字母的排列,这是我的代码 -
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;
}
它没有用,我不知道为什么 - 有人可以帮忙吗?
答案 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
部分。
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一样。
编辑:所以你知道你在运行时间方面的进展:
答案 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;
}