如何在JavaScript中生成单词中所有可能的字符替换组合?

如何在JavaScript中生成单词中所有可能的字符替换组合?,javascript,regex,algorithm,array-algorithms,Javascript,Regex,Algorithm,Array Algorithms,考虑下面这个虚构的词:“zazaza” 我试着想出一个函数,给定一个要替换的字母和一个匹配该字母的单词,生成该字母替换的所有组合 我有一个JSON,其中包含要匹配的字母和要替换的字母,如下所示: var generatedCombinations = generateAllCombinations(replacement, "zazaza"); var replacement={original:'Z',replace:'S'} 完整示例如下所示: var generatedCombinati

考虑下面这个虚构的词:“zazaza”

我试着想出一个函数,给定一个要替换的字母和一个匹配该字母的单词,生成该字母替换的所有组合

我有一个JSON,其中包含要匹配的字母和要替换的字母,如下所示:

var generatedCombinations = generateAllCombinations(replacement, "zazaza");
var replacement={original:'Z',replace:'S'}

完整示例如下所示:

var generatedCombinations = generateAllCombinations(replacement, "zazaza");
该数组将包含:

zazaza
sazaza
sasaza
sasasa
zasasa
zazasa
...
这听起来似乎更容易用递归实现,但据我所知,JavaScript中的函数调用可能很昂贵,所以我不确定是否采用这种方法。我认为我的主要问题是如何确保生成所有的组合


创建此数组的目的是让我可以将所有这些单词与其他单词进行匹配,因此,我不确定是否有一个正则表达式可以做到这一点,并且更易于实现。

有N个可能的位置可以插入替换字母,您的任务归结为生成一组位置的所有可能子集。这可以通过从0到2^N进行迭代来实现,每次迭代都会发出一个子集,其中包含与循环计数器的设置位相对应的元素

这是非常有效的,但由于javascript的限制,它只适用于最多32个元素

在一般情况下,递归是一种方法,例如:

let powerset = a => _powerset([[]], a);

let _powerset = (out, rest) =>
    rest.length ?
        _powerset(
            out.concat(out.map(x => x.concat(rest[0]))),
            rest.slice(1))
        : out;
请注意,此函数是尾部递归的,因此现代JS引擎将能够优化函数调用

(无聊地等待V8编译,下面是完整的代码);)

let powerset=a=>_powerset([]],a);
让_powerset=(out,rest)=>
休息时长?
_动力装置(
out.concat(out.map(x=>x.concat(rest[0])),
休息。切片(1))
:输出;
让枚举=(str,char)=>[…str]
.map((c,i)=>[c,i])
.filter(p=>p[0]==char)
.map(p=>p[1]);
让translate=(str,pos,replace)=>[…str]
.map((c,i)=>位置包括(i)?替换:c)/@todo:optimize me
.加入(“”);
让所有替换=(str,char,replace)=>
powerset(枚举(str,char)).map(pos=>translate(str,pos,replace));

日志(所有替换('u abc_def_x','u','@')函数调用并不昂贵。使用递归,没有什么问题。不,正则表达式在这里没有任何帮助。非常感谢,这正是我想要的:)还有一件事,我正在用typescript编码,当它传输到javascript时,我得到了以下错误:这个问题有解决方法吗?我通过更改[…str]带拆分(“”)。再次感谢:)