题目描述:
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函数里都是错误。原因未知。
相关链接:
正则表达式教程之重复匹配详解https://www.jb51.net/article/102442.htm
java连续多位相同字符判断的正则表达式https://my.oschina.net/duanyunhu/blog/213397