描述

输入一个字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。例如输入字符串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版)相关推荐

  1. 剑指offer思路与实现总结(Java版)

    ##节选剑指offer比较经典和巧妙的一些题目,以便复习使用.一部分题目给出了完整代码,一部分题目比较简单直接给出思路.但是不保证我说的思路都是正确的,个人对算法也不是特别在行,只不过这本书的算法多看 ...

  2. 左神算法:判断 t1 树是否包含t2 树全部的拓扑结构(剑指 Offer 26. 树的子结构,Java版)

    本题来自左神<程序员代码面试指南>"判断 t1 树是否包含t2 树全部的拓扑结构"题目. 题目 剑指 Offer 26. 树的子结构 给定彼此独立的两棵树头节点分别为 ...

  3. 【剑指offer】 登峰造极--字符串的排列

    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 热度指数:623760 本题知识点: 字符串 动态规划 递归 算法知识视频讲解 题目描述 输入一个字符串,按字典 ...

  4. 剑指offer 28:字符串的排列

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 解题思路 参考 ...

  5. 剑指 Offer II 014. 字符串中的变位词

    剑指 Offer II 014. 字符串中的变位词 题目 示例 解答 题目来源为leetcode 题目 给定两个字符串s1和s2,写一个函数来判断s2是否包含s1的某个变位词. 换句话说,第一个字符串 ...

  6. 【LeetCode】剑指 Offer 67. 把字符串转换成整数

    [LeetCode]剑指 Offer 67. 把字符串转换成整数 文章目录 [LeetCode]剑指 Offer 67. 把字符串转换成整数 package offer;public class So ...

  7. [剑指offer]二叉搜索树的后序遍历数列

    [剑指offer]二叉搜索树的后序遍历数列 剑指offer-二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 fals ...

  8. [[EVD]] - 剑指 Offer 67. 把字符串转换成整数

    题目分析:[[EVD]] - 剑指 Offer 67. 把字符串转换成整数https://leetcode-cn.com/problems/ba-zi-fu-chuan-zhuan-huan-chen ...

  9. 《LeetCode力扣练习》剑指 Offer 10- II. 青蛙跳台阶问题 Java

    <LeetCode力扣练习>剑指 Offer 10- II. 青蛙跳台阶问题 Java 一.资源 题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总 ...

最新文章

  1. linux下php连接mysql数据库_Linux下PHP连接Oracle数据库
  2. 天然气阶梯是按年还是按月_按年算账 多退少补 你的年度个税应该是怎么算?...
  3. Oracle用户和权限管理
  4. 04-06 session,cookie,token 区别
  5. 软件工程师的技能知识图谱0.1(偏后台方向)
  6. 一周最新示例代码回顾 (4/23–4/29)
  7. python django restful_利用Django实现RESTful API(一)
  8. java t800,T800KPI绩效考核系统C#源码
  9. 年底淘宝中小型卖家,要如何提高流量!
  10. Android 高斯模糊效果从319ms到3ms的优化实现
  11. 美团点评后台开发历年习题练习
  12. Clarke and MST(最大生成树)
  13. 魔兽修改默认服务器,魔兽怎么设置默认服务器
  14. 开源私有云盘python_使用Seafile搭建个人专属私有云盘
  15. DHCP magic cookie
  16. CS5268规格书|CS5268功能介绍|TYPE-C转HDMI+VGA
  17. 组播路由协议——PIM基本概念
  18. 我眼中的中国科研:一个中科院退学博士生的感想
  19. 西湖大学开学:新生每月5000元补助,AI博士研究永生课题
  20. java map key 升序_Java Map 按 key 升序排序

热门文章

  1. Centos7修复ssh弱密钥交换算法漏洞
  2. 程序员如何开启老干妈瓶盖
  3. JS向上取整、向下取整、四舍五入等集锦,一看就懂直接CV
  4. 用sizeof函数对变量数据所占字节数进行测量
  5. 没有想的那么美 游戏开发企业的一些真相
  6. sql语言中,datepart和datename的区别
  7. html输入公式得到混合运算结果,excel表格乘法公式怎么输入
  8. 博客搭建全流程与心得(宝塔+Typecho)
  9. 升级鸿蒙系统流畅度,华为mate9很卡,升级鸿蒙系统,流畅度基本超越iOS12?
  10. 二分 - Enduring Exodus - CodeForces - 655C