字符串的排列

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。

解题思路:

1.列出所有字符串用递归求解。
对于n个字符串的排列问题。如果能生成n - 1个元素的全部排列结果,就能生成n个元素的全部排列结果。
以abc为例:

F(String str ,int start ,int end)
F(abc,start,end)=F(abc,start+1,end)+F(bac,start+1,end)+F(cba,start+1,end)
F(abc,start,end)=abc (start==end)

2.结果按字典顺序输出,这就用到了强大的TreeSet了,直接排好序。又因为题目中要求返回ArrayList类型,故将TreeSet中元素全部加入ArrayList中

代码:

import java.util.*;
public class Solution {public ArrayList<String> Permutation(String str) {ArrayList<String> result = new ArrayList<String>();//根据返回类型需要if(str==null||str.length()==0){return result;}char[] chars = str.toCharArray();TreeSet<String> res = new TreeSet<String>(); //用于排序输出getResult(chars,0,str.length()-1,res);result.addAll(res) ;//添加到ArrayListreturn result ;}public void getResult(char[] chars,int start,int end,TreeSet<String> res){if(start==end){res.add(String.valueOf(chars));}else{for(int i=start;i<=end;i++){swap(chars,start,i);//换一位getResult(chars,start+1,end,res);//递归swap(chars,start,i);//换回来,保证下次换位是正确的}}}public void swap(char[] chars,int a,int b){if(a==b){//因为会出现原位置与原位置交换,直接空即可}else{char temp = chars[a];chars[a]=chars[b];chars[b]=temp;}}
}

转载于:https://www.cnblogs.com/lingongheng/p/6444228.html

剑指offer_输入一个字符串,按字典序打印出该字符串中字符的所有排列相关推荐

  1. 【20190405】算法-输入一个字符串,按字典序打印出该字符串中字符的所有排列

    方法一:利用递归 利用递归求全排列的过程真的很难理解,先把代码贴上来吧 function Permutation(str) {// write code hereif(!str){return str ...

  2. 剑指offer_输入n个整数,找出其中最小的K个数

    最小的K个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 本题无非就是排序,取前K个值.但选什么排序算法呢? ...

  3. 剑指offer_第19题_顺时针打印矩阵_Python

    题目描述 输入一个矩阵 按照从外向里以顺时针的顺序依次打印出每一个数字 例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  4. java从键盘输入数据斐波那契数_从键盘输入一个正整数n,打印出斐波那契数列的前n个元素...

    import java.util.*; public class Test { public static void main(String[] args){ Scanner in = new Sca ...

  5. 《剑指Offer》 从上往下打印出二叉树

    题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 其实就是层序遍历,设置一个TreeNode*类型的队列s,用来保存二叉树层序遍历的节点,因为队列是先进先出,所以很好地控制了 ...

  6. java剑指offer_剑指offer题目java实现

    Problem2:实现Singleton模式 题目描述:设计一个类,我们只能生成该类的一个实例 1 packageProblem2;2 3 public classSingletonClass {4 ...

  7. JAVA实现输入一个整数,输出该数二进制表示中1的个数(《剑指offer》)

    题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 这个题目有个比较有意思并且被公认的解法,我就先贴答案吧: public class Solution {public int ...

  8. 剑指offer_两个链表的第一个公共结点

    题目描述 输入两个链表,找出它们的第一个公共结点. 解题思路: 遇到这种题目,瞬间想到HashMap- 用一个HashMap依次记录第一个链表的结点: 遍历第二个链表结点,一旦在HashMap中找到, ...

  9. 【Java算法题】剑指offer_数据结构之03队列栈

    前言 刷题链接: https://www.nowcoder.com/exam/oj/ta?page=2&tpId=13&type=265 原定于5.30写完队列&栈,超时了14 ...

  10. 剑指offer_第一个只出现一次的字符

    题目描述 在一个字符串(1<=字符串长度<=10000,全部由大小写字母组成)中找到第一个只出现一次的字符,并返回它的位置. 时间复杂度O(n):遍历一次字符串,将字符与其出现的次数记录在 ...

最新文章

  1. 集结阿里云数据库最强阵容 DTCC 2019 八大亮点抢先看
  2. springcloud完整项目_.net core+Spring Cloud学习之路 一
  3. deepin linux桌面设置,在Deepin Linux桌面创建快捷方式
  4. aes256 加密后的长度_视频会议Zoom 5.0版本重大更新,增强加密功能提供更多安全选项...
  5. [Vue.js] 路由 -- 前端路由
  6. 标题在优化排名的写法
  7. Python基础===使用virtualenv创建一个新的运行环境
  8. 使用Jasypt加密spring boot应用配置文件的敏感信息
  9. 如何PDF转Word文档?快把这些方法收好
  10. python写给初学者的一封信
  11. HL7协议介绍(一)
  12. String常用方法汇总
  13. Thinkpad E430 移除网卡白名单
  14. 清除浏览器痕迹(RunDll32.exe)
  15. 编程”灵魂之心“之消息机制
  16. 我的朋友老曹,居然用数据工具搞了这么多事
  17. iNFTnews丨世界首个元宇宙时装周将在Decentraland举办
  18. 关于RFID电感耦合方式的射频前端工作原理,你了解吗?
  19. 2020 CSP-J2题目
  20. 【oracle】 字段属性为 date 的相关操作

热门文章

  1. 系统计算机名是中文,导致VisualSVN安装失败
  2. 汝把公司搞死了,不批汝批谁?
  3. Ubuntu用Apache2快速搭建一个HTTP文件服务器
  4. 继承与data member之单一继承
  5. 3使用技巧_盆栽金钱树,平时使用“3个”技巧,叶子稠密、基部冒新芽
  6. C# 自定义网格 dataGridView 三角箭头移动 获取当前行列序号 滚动条显示改变 滚动条定位索引
  7. camunda 流程执行追踪_从Activiti分裂而来的camunda BPM
  8. python 转成摩尔斯电码_【无线电史话】比莫尔斯电码更直观 | 1919年的护林员通过Myer码传递信息...
  9. java方法介绍_Java 方法介绍
  10. python和tableau优缺点_matplotlib和Tableau之间哪一个最好?