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