No repeats please(freecodecamp高级算法6)

把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准

例如, aab 应该返回 2 因为它总共有6中排列 (aab, aab, aba, aba, baa, baa), 但是只有两个 (aba and aba)没有连续重复的字符 (在本例中是 a).

function permAlone(str) {

                    //使用正则匹配连续重复
                    var regex = /(.)\1+/g;//括号代表分组,\1表示获得和第一个分组里完全相同的内容

                    //把字符串转化为数组,便于处理
                    var arr = str.split(‘‘);
                    //储存全排列数组
                    var permutations = [];
                    var tmp;

                    //函数功能:对调位置
                    function swap(index1, index2) {
                        tmp = arr[index1];
                        arr[index1] = arr[index2];
                        arr[index2] = tmp;
                    }

                    //使用Heap‘s Algorithm生成全排列数组
                    function generate(n) {
                        if (n === 1) {
                            permutations.push(arr.join(‘‘));
                        } else {
                            for (var i = 0;i< n ; ++i) {generate(n - 1);
                                swap(n % 2 ? 0 : i, n - 1);
                            }
                        }
                    }

                    generate(arr.length);

                    //把没有连续重复排列的数组过滤出来
                    var filtered = permutations.filter(function(string) {
                        return !string.match(regex);
                    });

                    //返回其数量
                    return filtered.length;
                }
                alert(permAlone("aabfcdf"));

Heap‘s algorithm全排列算法

procedure generate(n : integer, A : array of any):
    if n = 1 then
        output(A)
    else
        for i := 0; i < n - 1; i += 1 do
            generate(n - 1, A)
            if n is even then
                swap(A[i], A[n-1])
            else
                swap(A[0], A[n-1])
            end if
         end for
         generate(n - 1, A)
    end if

i=n时,算法产生所有全排列;

如果n是奇数,则将排列里的第一个元素与最后一个元素互换。如果n是偶数,将排列的第i个元素与最后一个元素互换。

时间: 2024-10-08 09:44:54

No repeats please(freecodecamp高级算法6)的相关文章

Freecodecamp 高级算法(个人向)

freecodecamp 高级算法地址戳这里. freecodecamp的初级和中级算法,基本给个思路就能完成,而高级算法稍微麻烦了一点,所以我会把自己的解答思路写清楚,如果有错误或者更好的解法,欢迎留言. Validate US Telephone Numbers 如果传入字符串是一个有效的美国电话号码,则返回 true. 简单来说,美国号码的规则就是,国家代码(必须为1),然后就是3,3,4的数字组合,前三个数字可以用括号包起来.另外就是间隔使用空格或者"-". 因为输入值肯定是字

Map the Debris(freecodecamp高级算法8)

Map the Debris 返回一个数组,其内容是把原数组中对应元素的平均海拔转换成其对应的轨道周期. 原数组中会包含格式化的对象内容,像这样 {name: 'name', avgAlt: avgAlt}. 以轨道高度计算轨道周期的公式 a:轨道的半长轴(m),μ = GM 求得的值应该是一个与其最接近的整数,轨道是以地球为基准的. 地球半径是 6367.4447 kilometers, 地球的GM值是 398600.4418, 圆周率为Math.PI function orbitalPeri

面试高级算法梳理笔记

面试高级算法梳理笔记 1.1 说明 本篇为<挑战程序设计竞赛(第2版)>读书笔记系列,旨在: 梳理算法逻辑 探索优化思路 深入代码细节 1.2 目录 原文首发于个人博客Jennica.Space,按算法难度划分为初中高三个级别,详细目录及链接如下: 初级篇 穷竭搜索 贪心 动态规划 数据结构 图论 数论 中级篇 二分搜索 常用技巧 数据结构(二) 动态规划(二) 网络流 计算几何 高级篇 数论(二) 博弈论 图论(二) 常用技巧(二) 智慧搜索 分治 字符串 1.3 题解 配套习题及详解同步发

【高级算法】禁忌搜索算法解决3SAT问题(C++实现)

转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46440389 近期梳理,翻出了当年高级算法课程做的题目.禁忌搜索算法解决3SAT问题. 吐槽:数学符号怎样在编辑器里打出来啊,为了保留符号,我直接截图了. 1 SAT问题描写叙述 定理4.4.1: 赋值v为使CNF可满足的充要条件是f(x1,x2,-,xm)达到最小值0. 2  禁忌搜索算法 禁忌搜索算法是在局部搜索的过程中引进了贪心选择机制.并利用禁忌表改动邻域,通过构造的候选

js 高级算法 - 动态规划

主要是看了<数据结构与算法>有所感悟,虽然这本书被挺多人诟病的,说这有漏洞那有漏洞,但并不妨碍我们从中学习知识. 其实像在我们前端的开发中,用到的高级算法并不多,大部分情况if语句,for语句,swith语句等等,就可以解决了.稍微复杂的,可能会想到用递归去的解决. 但要注意的是递归写起来简洁,但实际上执行的效率并不高. 我们再看看动态规划的算法: 动态规划解决方案从底部开始解决问题, 将所有小问题解决掉, 然后合并成一个整体解决方案, 从而解决掉整个大问题 . 实例举例  (计算斐波那契数列

【高级算法】遗传算法解决3SAT问题(C++实现)

转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46910079 1 SAT问题描写叙述 命题逻辑中合取范式 (CNF) 的可满足性问题 (SAT)是当代理论计算机科学的核心问题, 是一典型的NP 全然问题.在定义可满足性问题SAT之前,先引进一些逻辑符号. 一个 SAT 问题是指: 对于给定的 CNF 是否存在一组关于命题变元的真值指派使A为真. 显然,如A为真,则CNF的每一个子句中必有一个命题变元为1(真). 2 遗传算法

高级算法——贪心算法(找零问题)

function makeChange(origAmt, coins) {//贪心算法——找零问题 var remainAmt ; if (origAmt % .25 < origAmt) { coins[3] = parseInt(origAmt / .25); remainAmt = origAmt % .25; origAmt = remainAmt; } if (origAmt % .1 < origAmt) { coins[2] = parseInt(origAmt / .1); r

高级算法——贪心算法(背包问题)

贪心算法不能用来解决离散物品问题的原因是我们无法将“ 半台电视” 放入背包. 规则是按照物品价值高低顺序放入背包. function ksack(values, weights, capacity) { var load = 0; var i = 0; var v = 0; while (load < capacity && i < weights.length) { if (weights[i] <= (capacity - load)) { v += values[i

链表高级算法——2

一.判断两个链表是否相交 int CheckCross(pLinkList list1, pLinkList list2) //判断链表是否相交 { assert(list1); assert(list2); pLinkNode cur1 = list1->pHead; pLinkNode cur2 = list2->pHead; if ((NULL==list1->pHead)||(NULL==list2->pHead)) { return -1; } while (NULL!=