Javascript 排列所有字符串中的单词
我有一个文本数组,每个元素中可以有多个单词。例如,阵列可能如下所示:Javascript 排列所有字符串中的单词,javascript,arrays,Javascript,Arrays,我有一个文本数组,每个元素中可以有多个单词。例如,阵列可能如下所示: let myArray = ['big bad wolf','go home'] big bad wolf bad big wolf wolf bad big wolf big bad big wolf bad bad wolf big go home home go 我想要一个算法,将其转换成字符串或其他数组,在其中生成同一行上所有可能的单词组合。输出如下所示: let myArray = ['big bad wolf'
let myArray = ['big bad wolf','go home']
big bad wolf
bad big wolf
wolf bad big
wolf big bad
big wolf bad
bad wolf big
go home
home go
我想要一个算法,将其转换成字符串或其他数组,在其中生成同一行上所有可能的单词组合。输出如下所示:
let myArray = ['big bad wolf','go home']
big bad wolf
bad big wolf
wolf bad big
wolf big bad
big wolf bad
bad wolf big
go home
home go
采用您在注释中发布的方法,并为数组的每个元素调用它。
注意:我重新命名了它,以便它更适合置换示例,并且还做了一个更改,以便在空白处拆分
const arr=[“大灰狼”,“回家去”];
让我们重新来过;
arr.forEach((x)=>{
res=getPermutations(x);
控制台日志(res);
})
功能交换(字,i,j){
const tmp=单词[i];
字[i]=字[j];
字[j]=tmp;
}
函数getPermutations(输入){
让计数器=[],
排列=[],
单词=输入。拆分(“”),
长度=words.length,
我
对于(i=0;i }
采用您在评论中发布的方法,并为数组的每个元素调用它。
注意:我重新命名了它,以便它更适合置换示例,并且还做了一个更改,以便在空白处拆分
const arr=[“大灰狼”,“回家去”];
让我们重新来过;
arr.forEach((x)=>{
res=getPermutations(x);
控制台日志(res);
})
功能交换(字,i,j){
const tmp=单词[i];
字[i]=字[j];
字[j]=tmp;
}
函数getPermutations(输入){
让计数器=[],
排列=[],
单词=输入。拆分(“”),
长度=words.length,
我
对于(i=0;i }
让我们编写一个permute
函数,它接受一个字符串数组并返回一个排列数组,例如
permute(['big','bad','wolf']);
//=>[[“大”、“坏”、“狼”]
//=>,[“大”、“狼”、“坏”]
//=>,[“坏”、“大”、“狼”]
//=>,[“坏”、“狼”、“大”]
//=>,[“狼”、“大”、“坏”]
//=>,[“狼”、“坏”、“大”]]
这里有一种方法:
const without=(i,xs)=>xs.filter((u,j)=>j!==i);
常数排列=
xs=>
xs.length==1?[xs[0]]
:xs.length==2?[[xs[0],xs[1]],[xs[1],xs[0]]
:xs.flatMap((xx,i,xxs)=>
排列(无(i,xxs))
.map(ys=>[xx,…ys]);
排列一个由一个或两个元素组成的数组是很简单的(这是您早期的退出条件),否则迭代当前元素并将其与所有其他元素一起排列(这就是为什么不带的函数很有用的原因)
将“大坏狼”拆分成[“大”、“坏”、“狼”]
很简单:str.split(“”)
。
加入['big'、'bad'、'wolf']
成为'big bad wolf'
:arr.join('')
现在,您需要做的就是:
迭代字符串数组
对于每个字符串,将其拆分为单词
把那些话排列一下
加入每个排列
['big bad wolf','go home']
.flatMap(str=>
排列(str.split(“”))
.map(perm=>perm.join(“”));
//=>[“大灰狼”
//=>,“大灰狼坏了”
//=>,“坏大灰狼”
//=>,“大灰狼”
//=>,“狼大坏”
//=>,“狼坏大”
//=>,“回家”
//=>,“回家”]
让我们编写一个permute
函数,它接受一个字符串数组并返回一个排列数组,例如
permute(['big','bad','wolf']);
//=>[[“大”、“坏”、“狼”]
//=>,[“大”、“狼”、“坏”]
//=>,[“坏”、“大”、“狼”]
//=>,[“坏”、“狼”、“大”]
//=>,[“狼”、“大”、“坏”]
//=>,[“狼”、“坏”、“大”]]
这里有一种方法:
const without=(i,xs)=>xs.filter((u,j)=>j!==i);
常数排列=
xs=>
xs.length==1?[xs[0]]
:xs.length==2?[[xs[0],xs[1]],[xs[1],xs[0]]
:xs.flatMap((xx,i,xxs)=>
排列(无(i,xxs))
.map(ys=>[xx,…ys]);
排列一个由一个或两个元素组成的数组是很简单的(这是您早期的退出条件),否则迭代当前元素并将其与所有其他元素一起排列(这就是为什么不带
的函数很有用的原因)
将“大坏狼”拆分成[“大”、“坏”、“狼”]
很简单:str.split(“”)
。
加入['big'、'bad'、'wolf']
成为'big bad wolf'
:arr.join('')
现在,您需要做的就是:
迭代字符串数组
对于每个字符串,将其拆分为单词
把那些话排列一下
加入每个排列
['big bad wolf','go home']
.flatMap(str=>
排列(str.split(“”))
.map(perm=>perm.join(“”));
//=>[“大灰狼”
//=>,“大灰狼坏了”
//=>,“坏大灰狼”
//=>,“大灰狼”
//=>,“狼大坏”
//=>,“狼坏大”
//=>,“回家”
//=>,“回家”]
您可以查看JavaScript中可用的数组方法,并确定哪种方法适合您的需要。然后试着用它。我不知道逻辑是什么。递归是我想到的一个术语