javascript 字符串的排列与组合
不重复字符串的组合
输入 | 输出 |
---|---|
没有重复值的字符串 | 所有可能的组合值 |
abc | a,b,c,ab,bc,abc |
思路
递归的思想。一个字符串的所有组合值包含三种情况:
1. 仅包含首字母
2. 首字母+除首字母外的字符串组合值
3. 除首字母外的字符串组合值
实现
function getCombination(str){if(str.length === 1){return [str]}let arr1 = arguments.callee(str.slice(1));let res1 = arr1.map(x => str[0]+x);let res2 = arguments.callee(str.slice(1));let res3 = [str[0]]return res1.concat(res2,res3);
}console.log(getCombination("abc"));
//["abc", "ac", "ab", "bc", "c", "b", "a"]
不重复字符串的排列
输入 | 输出 |
---|---|
不重复字符串 | 所有可能的排列值 |
abc | abc,acb,bac,bca,cab,cba |
思路
递归。对于ab的排列值,先求出b的排列值,然后将a放置与b之前和b之后,得到ab的排列值。
对于abc的排列值,先求出bc的所有排列值,然后将a放置于后两个数的之前/之中/之后三个位置之一,得到abc的所有排列值。以此类推。
实现
function getPerputation(str){if (str.length == 1) {return [str];}let res = []let arr = arguments.callee(str.slice(1));for(let i = 0;i < arr.length;i++){let partArr = [];for(let j = 0;j < arr[i].length+1;j++){let newStr = arr[i].slice(0,j) + str[0] + arr[i].slice(j);partArr.push(newStr);}res = res.concat(partArr)}return res;
}console.log(getPerputation("abc"));
//["abc", "bac", "bca", "acb", "cab", "cba"]
第二种思路
递归。abc的所有组合值可以分为以下部分:
1. a + 剩余字母组合值;
2. b+ 剩余字母组合值;
3. c+剩余字母组合值;
实现
function getPerputation2(str){if(str.length ==1){return [str];}let res = [];for(let i = 0; i < str.length; i++){let restStr = str.slice(0,i)+str.slice(i+1);let restArr = arguments.callee(restStr);restArr=restArr.map(x => str[i] + x);res = res.concat(restArr);}return res;
}console.log(getPerputation2("abc"));
不重复字符串的排列组合
思路
先求组合值,对每个可能的组合值进行排列
实现
function getComAndPer(str){let comArr = getCombination(str);let res =[]for(let i = 0;i < comArr.length; i++){let perArr = getPerputation(comArr[i]);res = res.concat(perArr);}return res;
}
console.log(getComAndPer("abc"));
//["abc", "bac", "bca", "acb", "cab", "cba", "ac", "ca", "ab", "ba", "bc", "cb", "c", "b", "a"]
可能存在重复元素时
对于可能存在重复的字符串,按照上述方法求排列组合之后的结果可能存在重复值。可以对结果进行去重后再返回。
例如,求aabc的组合值。
function getComWithRepeat(str){let resWithReapeat = getCombination(str);return [...new Set(resWithReapeat)]
}console.log(getComWithRepeat("aac"));
//["aac", "ac", "aa", "c", "a"]
javascript 字符串的排列与组合相关推荐
- 无重复字符串的排列组合
无重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同. 示例1: 输入:S = "qwe" 输出:["qwe", " ...
- leetcode面试题 08.08. 有重复字符串的排列组合(回溯)
有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe" 输出:["eqq","qeq",&q ...
- 程序员面试金典 - 面试题 08.07. 无重复字符串的排列组合(回溯)
1. 题目 无重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同. 示例1:输入:S = "qwe"输出:["qwe", & ...
- java字符串字符排列组合_如何在Java中查找字符串的所有排列
java字符串字符排列组合 In this tutorial, we will learn how to find the permutation of a String in a Java Prog ...
- 【亡羊补牢】挑战数据结构与算法 第18期 LeetCode 面试题 08.08. 有重复字符串的排列组合(递归与回溯)
仰望星空的人,不应该被嘲笑 题目描述 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe"输出:["eqq", ...
- JAVA练习177-有重复字符串的排列组合
有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe" 输出:["eqq","qeq", ...
- 面试题 08.08. 有重复字符串的排列组合-快速排序+回溯深度优先搜索
面试题 08.08. 有重复字符串的排列组合+快速排序加回溯深度优先搜索 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe" 输 ...
- 面试题 08.08. 有重复字符串的排列组合
面试题 08.08. 有重复字符串的排列组合 有重复字符串的排列组合.编写一种方法,计算某字符串的所有排列组合. 示例1: 输入:S = "qqe"输出:["eqq&qu ...
- java练习: 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
import java.util.ArrayList; import java.util.Scanner;/*** 7. 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:* 原始字 ...
- 字符串的全排列和组合算法
转载http://blog.csdn.net/hackbuteer1/article/details/7462447,感谢Hackbuteer1. 全排列在笔试面试中很热门,因为它难度适中,既可以考察 ...
最新文章
- 绝对经典的滑轮新闻显示(javascript+css)实现
- mysql锁与程序锁_数据库加锁(转)
- Java问题解决:Java compiler level does not match the version of the installed Java project facet....
- baidu+app+per+android,百度移动统计|移动应用APP统计|android统计分析|iOS统计分析
- UNICODE转多字节
- 使用C#开发一个简单的P2P应用
- ajax给data赋值,vue 2.0 methods 里ajax生成的数据,怎么赋值给data
- var、let 及 const 区别
- LeetCode 85. 最大矩形(DP/单调递增栈,难)
- RocketMQ核心架构设计思想
- Http Module 介绍[转]
- 和 jQuery 说再见,Bootstrap 5 将移除对其依赖
- AndroidStudio安卓原生开发_Activity的启动模式singleInstance启动模式---Android原生开发工作笔记88
- Android JetPack –导航架构
- matlab求出拟合曲线的方程,已知数据点,拟合曲线并得到曲线方程。谢谢
- 参考文献格式字号字体_论文格式字体字号要求
- STM32压力传感器信号采集-24位AD HX720 HX711 原理介绍
- 如何画一个算法流图?
- python 输出上三角行列式
- windows无法连接到user profile service服务。此问题阻止标准用户登录系统