剑指offer(二十七)-字符串的排列(Java版)
描述
输入一个字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
示例1
输入:"ab"
返回值:["ab","ba"]
说明:
返回["ba","ab"]也是正确的
示例2
输入:"aab"
返回值:["aab","aba","baa"]
示例3
输入:"abc"
返回值:["abc","acb","bac","bca","cab","cba"]
第一种解决方法,对于一个长度为n的字符串来说,它所有字符的排列组合数量为 n!(n*(n-1)...1*),对于第一个字符来说,它的选择是有n中,而第二个字符就只有n-1种了,依次类推,最后一个字符只有一种选择,可以选择递归来实现,代码如下。
public ArrayList<String> firstPermutation(String str) {ArrayList<String> arrayList = new ArrayList<>();if (null == str || str.length() < 1) {return arrayList;}messageStr(arrayList, 0, str.toCharArray());return arrayList;}public void messageStr(ArrayList<String> arrayList, int start, char[] chars) {//说明是最后一个字符了if (start == chars.length - 1) {String s = String.valueOf(chars);if (!arrayList.contains(s)) {arrayList.add(s);}} else {for (int i = start; i < chars.length; i++) {swap(chars, i, start);messageStr(arrayList, start+1, chars);//交换回位置,为了确保字符顺序不被改变swap(chars, i, start);}}}private void swap(char[] chars, int i, int j) {char tmp = chars[i];chars[i] = chars[j];chars[j] = tmp;}
第二种解法,直接将所有情况列举出来,比如a,就只有一种情况,ab则有两种情况,ab,ba,如果此时再加一个c进来,变成abc,这个c可以放ab的前面,可以放ab的中间,也可以放ab的后面,依次类推,我们遍历所有情况即可,最后对list去个重即可,代码如下
public ArrayList<String> secondPermutation(String str) {ArrayList<String> arrayList = new ArrayList<>();if (null == str || str.length() < 1) {return arrayList;}//将第一个数字放入集合李arrayList.add(str.charAt(0)+"");for(int i = 1; i < str.length(); i++){ArrayList<String> resList = new ArrayList<>();char c = str.charAt(i);for (String s : arrayList) {//放s前面String result = c + s;resList.add(result);//放s后面result = s + c;resList.add(result);// 加在中间for (int j = 1; j < s.length(); j++) {result = s.substring(0, j) + c + s.substring(j);resList.add(result);}}arrayList = resList;}return (ArrayList<String>) arrayList.stream().distinct().collect(Collectors.toList());}
剑指offer(二十七)-字符串的排列(Java版)相关推荐
- 剑指offer思路与实现总结(Java版)
##节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行,只不过这本书的算法多看 ...
- 左神算法:判断 t1 树是否包含t2 树全部的拓扑结构(剑指 Offer 26. 树的子结构,Java版)
本题来自左神<程序员代码面试指南>"判断 t1 树是否包含t2 树全部的拓扑结构"题目. 题目 剑指 Offer 26. 树的子结构 给定彼此独立的两棵树头节点分别为 ...
- 【剑指offer】 登峰造极--字符串的排列
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 热度指数:623760 本题知识点: 字符串 动态规划 递归 算法知识视频讲解 题目描述 输入一个字符串,按字典 ...
- 剑指offer 28:字符串的排列
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 解题思路 参考 ...
- 剑指 Offer II 014. 字符串中的变位词
剑指 Offer II 014. 字符串中的变位词 题目 示例 解答 题目来源为leetcode 题目 给定两个字符串s1和s2,写一个函数来判断s2是否包含s1的某个变位词. 换句话说,第一个字符串 ...
- 【LeetCode】剑指 Offer 67. 把字符串转换成整数
[LeetCode]剑指 Offer 67. 把字符串转换成整数 文章目录 [LeetCode]剑指 Offer 67. 把字符串转换成整数 package offer;public class So ...
- [剑指offer]二叉搜索树的后序遍历数列
[剑指offer]二叉搜索树的后序遍历数列 剑指offer-二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 fals ...
- [[EVD]] - 剑指 Offer 67. 把字符串转换成整数
题目分析:[[EVD]] - 剑指 Offer 67. 把字符串转换成整数https://leetcode-cn.com/problems/ba-zi-fu-chuan-zhuan-huan-chen ...
- 《LeetCode力扣练习》剑指 Offer 10- II. 青蛙跳台阶问题 Java
<LeetCode力扣练习>剑指 Offer 10- II. 青蛙跳台阶问题 Java 一.资源 题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总 ...
最新文章
- linux下php连接mysql数据库_Linux下PHP连接Oracle数据库
- 天然气阶梯是按年还是按月_按年算账 多退少补 你的年度个税应该是怎么算?...
- Oracle用户和权限管理
- 04-06 session,cookie,token 区别
- 软件工程师的技能知识图谱0.1(偏后台方向)
- 一周最新示例代码回顾 (4/23–4/29)
- python django restful_利用Django实现RESTful API(一)
- java t800,T800KPI绩效考核系统C#源码
- 年底淘宝中小型卖家,要如何提高流量!
- Android 高斯模糊效果从319ms到3ms的优化实现
- 美团点评后台开发历年习题练习
- Clarke and MST(最大生成树)
- 魔兽修改默认服务器,魔兽怎么设置默认服务器
- 开源私有云盘python_使用Seafile搭建个人专属私有云盘
- DHCP magic cookie
- CS5268规格书|CS5268功能介绍|TYPE-C转HDMI+VGA
- 组播路由协议——PIM基本概念
- 我眼中的中国科研:一个中科院退学博士生的感想
- 西湖大学开学:新生每月5000元补助,AI博士研究永生课题
- java map key 升序_Java Map 按 key 升序排序