从给定字符串(Javascript)生成所有可能的回文组合

从给定字符串(Javascript)生成所有可能的回文组合,javascript,string,algorithm,permutation,palindrome,Javascript,String,Algorithm,Permutation,Palindrome,我有一个字符串“racecarzz”,我想从该字符串中生成每个字符的所有可能组合,它们可以以相同的方式前后读取(回文) 检查回文并不难string.split(“”).reverse().join(“”),但是生成可能的组合对我来说是相当困难的 输入: str = 'racecarzz' 输出: arr = ['rar', 'cec', 'raar', 'caac', 'craarc', 'racecar', 'raczezcar', 'zracecarz', ...]` 我已经尝试了几个月

我有一个字符串“racecarzz”,我想从该字符串中生成每个字符的所有可能组合,它们可以以相同的方式前后读取(回文)

检查回文并不难
string.split(“”).reverse().join(“”)
,但是生成可能的组合对我来说是相当困难的

输入:

str = 'racecarzz'
输出:

arr = ['rar', 'cec', 'raar', 'caac', 'craarc', 'racecar', 'raczezcar', 'zracecarz', ...]`
我已经尝试了几个月的解决方案,但仍然缺少一些像“zracecarz”、“raczezcar”等

var组合=函数(字符串){
var结果=[];
变量循环=函数(开始、深度、前缀){
对于(变量i=开始;i 0){
循环(i+1,深度-1,下一个);
}否则{
//检查回文
if(next==next.split(“”).reverse().join(“”)){
结果。按下(下一步);
}
}
}
}

对于(var i=0;i如果您只想生成回文(而不必首先生成所有字符的所有可能组合,然后过滤掉非回文),请将输入中的字符分成两组,具体取决于它们出现的频率:

input:   racecarzz
singles: e
doubles: carz
然后,使用双精度字符生成每个组合:

c, a, r, z, ca, cr, cz, ac, ar, az ... zrca, zrac  
然后,使用这些组合中的每一个,创建3个回文:一个不重复最后一个字符,一个重复最后一个字符,一个中间只有一个字符:

c    -> c, cc, cec
ca   -> cac, caac, caeac
car  -> carac, carrac, carerac
carz -> carzrac, carzzrac, carzezrac
...
如果有多个单曲,请使用这些单曲中的每一个创建回文:

car -> carac, carrac, carerac, carfrac, cargrac ...  
不要忘记自己添加单个字符;“e”也是回文

如果一个字符出现3次,则将其一次添加到双精度字符中,一次添加到单精度字符中。如果出现4次,则将其两次添加到双精度字符中,依此类推。。。(这将创建重复的输出;如果您只需要唯一的解决方案,则在生成组合时必须避免重复,并在生成回文时对照单数检查组合中的最后一个字符。)


这是基本版本的代码示例:

函数拆分输入(str){
变量单值=[],双值=[];
for(str中的var i){
var char=str.charAt(i);
var pos=singles.indexOf(char);//检查singles中是否已存在
if(pos==-1)singles.push(char);//添加到singles
else double.push(singles.splice(位置1)[0]);//移动到double
}
返回{单打:单打,双打:双打};
}
函数生成组合(集合){
var combis=[];
addChar([],set);//使用空的部分集和完整集启动递归
返回梳;
函数addChar(部分,集合){
用于(集合中的var i){
var setCopy=set.slice();
var parCopy=partial.concat(setCopy.splice(i,1));//将字符添加到partial
梳状物推送(包裹);
if(setCopy.length)addChar(parCopy,setCopy);//如果剩余字符,则递归
}
}
}
函数生成器Lindromes(组合、单件){
var palins=singles.slice();//每一个都是回文
用于(组合中的var i){
var pos=combis[i]。长度;
var pal=combis[i].concat(['']);//为单个
pal=pal.concat(combis[i].reverse());//添加反向
for(单打中的var j){
PAL拼接(POS,1,单曲[j]);
palins.push(pal.join(“”));
}
pal.splice(位置1);palins.push(pal.join(“”));//删除单个
pal.splice(位置1);palins.push(pal.join(“”));//删除重复的最后一个字符
}
返回佩林;
}
函数回文组合(输入){
变量集=拆分输入(输入);
var combis=发电机组组合(双倍机组);
返回生成基线图(组合、集合、单件);
}

document.write(“racecarzz→”+回文组合(“racecarzz”);
“但生成可能的组合对我来说是一个挑战。”您在代码和/或算法过程的哪一部分遇到了问题?您可以包括您尝试解决查询的代码和/或算法吗?@RobbyCornelissen在哪里链接问题中提到的“回文”?您可以找到所有排列,并逐个检查回文one@guest271314OP声明:检查回文并不难[…]但是生成可能的组合对我来说是一个挑战。@guest271314显然你和potatopeelings一起投票赞成这个重复;这样做会让人困惑。我的评论是针对他的。就像魔术一样。谢谢!我添加了以下内容来按长度排序数组,然后按字母顺序返回数据集。sort(函数(a,b){return a.length-b.length | | | | | a.localeCompare(b);});@aznmunkey我添加了一个代码示例,该示例仅在输入包含出现3次或更多次的字符时生成唯一的解决方案。