w3cshool -- 排列组合去重算法挑战

    function permAlone(str) {
        if(str.length == 1) return str;
        var a = str.substr(0, 1), one = [a], count = 0, toggle = true;
        for(var i = 0; i< str.length-1; i++) {
            var temp = str[i+1]; // 取出需要插入的字母
            one = cha(one, temp)
        }
        // 判断数组是否有连续重复的
        for(var k = 0; k<one.length; k++){ //获取数组中的每一项
            for(var l = 0; l<one[k].length-1; l++){ //遍历每一项的字符串
                if(one[k][l] == one[k][l+1]) { // 如果存在有连续两个相等的字母
                    // 决策变量,判断是否合格
                    toggle = false;
                    break;
                } else {
                    toggle = true;
                }
            }
            // 判断toggle 是否为true
            if(toggle) count++;
        }
        return count;
    }

    permAlone(‘abfdefa‘);

    /*
        插值算法
        str: 需要被插入的数组
        v: 需要插入的字母
     */
    function cha(str, v) {
        var len = str.length; // 获取数组长度
        var arr = [] // 最后需要返回的数组
        for(var i = 0; i<len; i++) {
            for(var j = 0; j<str[i].length+1; j++){ //需要插入的次数等于字符串长度加一
                var star = str[i].substring(0, j)
                var end = str[i].substring(j, str[i].length);
                var ok = star + v + end;
                arr.push(ok);
            }
        }
        return arr;
    }

原文地址:https://www.cnblogs.com/litings/p/9400312.html

时间: 2024-11-09 04:20:01

w3cshool -- 排列组合去重算法挑战的相关文章

排列组合相关算法 python

获取指定长度得所有序列 通过事件来表述这个序列,即n重伯努利实验(二项分布)的所有可能结果.例如时间a表示为: a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 假设每次实验为从a中选择一个数字,那么进行n次实验,获得所有可能得序列. 比如,进行两次实验, n=2, 那么可能得结果有100个.这里因为每次实验都是相对独立的,所以每次实验的结果可能出现重复,也就是说在获得所有可能的序列中,可以存在重复得值. 递归实现,DFS(深度优先遍历) def gen_all_seque

Python排列组合简单算法实现

算法题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 程序源代码: 1 for i in range(1,5): 2 for j in range(1,5): 3 for k in range(1,5): 4 if( i != k ) and (i != j) and (j != k): 5 print i,j,k 实例输出结果为: 1 2 3 1 2 4 1

排列组合生成算法

r排列生成: gen 递归层数d表示正在生成第d个元素. vis记录是否出现过. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n, r; int A[50], vis[50];//记录第i个元素是否生成过 int cnt; int rer; void output(int r) { for(int i = 0; i < r; i++) printf(

一道排列组合的算法题

给你一个40斤的西瓜,给3个人分,有多少种分法?我用PHP实现的,代码如下 $aa = range(1,40); $bb = array(); foreach($aa as $k=>$val){ foreach($aa as $v){ foreach($aa as $vl){ $sum = $val+$v+$vl; if($sum == 40){ $bb[$k][0] = $val; $bb[$k][1] = $v; $bb[$k][2] = $vl; } } } } echo '<pre&g

STL_算法(17)_排列组合 next_permutation() perv_permutation()

next_permutation() prev_permutation() #include<iostream> #include<algorithm> #include<vector> // 排列组合开始之前一定要先排序 using namespace std; int main() { vector<int> ivec; ivec.push_back(1); ivec.push_back(2); ivec.push_back(3); for (vecto

C#的排列组合类

C#的排列组合类 //-----------------------------------------------------------------------------//// 算法:排列组合类//// 版权所有(C) Snowdust// 个人博客    http://blog.csdn.net/snowdust & http://snowdust.cnblogs.com// MSN & Email [email protected]//// 此源代码可免费用于各类软件(含商业软

迷人的算法-排列组合

需求 最近工作中碰到一个需求:我们的数据表有多个维度,任意多个维度组合后进行 group by 可能会产生一些”奇妙”的反应,由于不确定怎么组合,就需要将所有的组合都列出来进行尝试. 抽象一下就是从一个集合中取出任意元素,形成唯一的组合.如 [a,b,c] 可组合为 [a].[b].[c].[ab].[bc].[ac].[abc]. 要求如下: 组合内的元素数大于 0 小于等于 数组大小: 组合内不能有重复元素,如 [aab] 是不符合要求的组合: 组合内元素的位置随意,即 [ab] 和 [ba

算法练习:排列组合之子集合

问题描述 输入一个含有不同数字的序列,输出其所有子集合(含空集).要求:1)集合里元素有序排列:2)输出结果不含有重复集合 举例 输入序列{3,1,2} 输出:{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3} 问题分析 可以使用排列组合问题求解的第一种方法:分期摊还.初始化时,结果集合里含有一个空集.当扫描数列时,保留原有集合,同时将当前元素插入现有的所在集合中,从而形成新的集合.详见后面代码的GetSubSetsAmortized函数. 也可以使用第二种方法:f

java排列组合算法代码实现

原文:java排列组合算法代码实现 源代码下载地址:http://www.zuidaima.com/share/1550463479024640.htm java排列组合算法,有需要研究的童鞋可以下载,运行结果如下: package com.zuidaima.test; /** *@author www.zuidaima.com **/ public class Pailie { public static void main(String[] args) { int[] ia = {1, 2,