JavaScript实现无连续重复字符的全排列算法

作者:代码拾荒时间:2026-10-23 00:37:06浏览:173

本文详解如何使用JavaScript实现字符串全排列算法,重点解决生成结果中不包含连续重复字符的计数问题。通过递归交换法遍历所有排列,并利用正则表达式过滤包含连续重复项的结果,最终返回符合条件的排列总数。

问题定义与示例解析

将字符串中的字符重新排列以生成新字符串,并返回新生成的字符串中不包含连续重复字符的个数。这里的连续重复仅指单个字符的连续出现。

以字符串 'aab' 为例,它总共有 6 种排列方式(aab, aab, aba, aba, baa, baa)。其中,只有两个排列(aba 和 aba)不包含连续重复的字符,因此返回结果为 2。

参考网络资料中的思路,实现代码如下:

JavaScript 代码实现


function permAlone(str) {
 var arr=str.split("");
 var perarr=[];
 var begin=0;
 //创建正则,如果字符串全重复,则直接return 0
 var reg = /(.)\1+/g;
 if(str.match(reg)!==null&&str.match(reg)[0]===str){
  return 0;
 }
 //用于交换的函数
 function swap(idx1,idx2){
   var temp=arr[idx1];
   arr[idx1]=arr[idx2];
   arr[idx2]=temp;
 }
 //如果begin到了最后一个字符,可以将这个字符串加入到全排列数组中了
 function permall(arr,begin){
  if(begin==arr.length-1){
   perarr[perarr.length]=arr.join("");
   return;
  }
  for(var i=0;(i+begin)<arr.length;i++){
   swap(begin,begin+i);
   permall(arr,begin+1);
   swap(begin,begin+i);
  }
 }
 permall(arr,begin);
 //返回相邻不重复的数量
 return perarr.filter(function(val) {
   return !val.match(reg);
 }).length;
}

permAlone('aab');

算法逻辑详解

算法首先将第一个字符与后续每个字符依次进行交换。

随后,固定第一个字符,对剩余所有字符进行排列。此时,将剩余字符视为两部分:第一个字符及其后的所有字符。接着,将这部分中的第一个字符逐一与其后的字符进行交换。

去重的全排列逻辑在于:从第一个数字开始,将其与后面所有非重复出现的数字进行交换。

以上关于 JavaScript 实现 FCC 算法 'No repeats please' 的字符串全排列详解内容分享完毕,希望能为读者提供参考,并欢迎大家支持本站。

作者最新文章