题目描述:
No repeats please
把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准
例如, aab
应该返回 2 因为它总共有6中排列 (aab
, aab
, aba
, aba
, baa
, baa
), 但是只有两个 (aba
and aba
)没有连续重复的字符 (在本例中是 a
).
题目来源:FREECODECAMP304
解决问题:
- 重新排列
- 删除重复
解决方法:
- 不按照数学排列,直接枚举删去不符合条件的值
- 枚举采用全排列
- 正则表达式
var re = /(.)\1+/g;
代码:
1 function permAlone(str) { 2 var arr=str.split(""); 3 var result=[]; 4 perm(arr,0,arr.length-1,result);//result存储所有字符串 5 var Test=/(.)\1+/g; 6 result=result.filter(function(val){ return !val.match(Test);});//match函数匹配不符合条件的串 7 8 return result.length; 9 10 }11 function perm(arr,f,l,result)12 {13 14 if(f==l) { var str=arr.join(""); result.push(str); return result;}15 else{16 for(var i=f;i<=l;++i)17 {18 var temp=arr[f];19 arr[f]=arr[i];20 arr[i]=temp;21 perm(arr,f+1,l,result);//迭代22 temp=arr[f];23 arr[f]=arr[i];24 arr[i]=temp;25 }26 }27 }28 permAlone('aab');
遇到的问题:
将match函数换成test函数,结果将错误,内部的所有测试样例都符合条件,但是在filter函数里都是错误。原因未知。
相关链接:
正则表达式教程之重复匹配详解
java连续多位相同字符判断的正则表达式