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

输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

这里尤其需要注意2点:1.所有组合不能重复,比如输入"aa",  那么输出的结果应当是“aa” ; 2. 输出结果按字典序排序

如果用《剑指offer》上的方法,显然这两点都不能满足,比如输入"abc",输出结果为:"abc" "acb" "bac" "bca"  "cba" "cab" ,如果输入"aa",输出解过为"aa" "aa" 。显然,这两种结果都是有问题的。

下面是《剑指offer》版本的代码:

1 importjava.util.ArrayList;2 importjava.util.List;3 public classSolution {4 private List list = new ArrayList<>();5 privateStringBuffer buffer;6 public ArrayListPermutation(String str) {7 if(str==null||str.length()==0) return (ArrayList) list;8 buffer = newStringBuffer(str);9 PermutationCore(0);10 return (ArrayList) list;11 }12 public void PermutationCore(intbegin) {13 if(begin==buffer.length()-1){14 list.add(buffer.toString());15 }16 for(int i = begin;i

那么如何解决上面两点存在的问题呢?这里给推荐一种数据结构,TreeSet。 这个在C++中我不知道有没有,应该是没有,但是作为Java程序员,这是比较幸福的地方。

TreeSet这个数据结构本身采用红黑树实现,能够自动将字符串按照字典序排序,同时因为其实现了Set接口,所以又能同时保证所有的结果是一个集合。而学过离散数学的朋友都知道,集合中的元素是不会重复的,所以如果我们采用TreeSet对排列的结果进行存储,那么就能轻易的达到上述要求。下面是本人实现的代码:

1 importjava.util.ArrayList;2 importjava.util.Iterator;3 importjava.util.List;4 importjava.util.Set;5 importjava.util.TreeSet;6 public classSolution {7 private List list = new ArrayList<>();8 private Set set = new TreeSet<>();9 privateStringBuffer buffer;10 public ArrayListPermutation(String str) {11 if(str==null||str.length()==0) return (ArrayList) list;12 buffer = newStringBuffer(str);13 PermutationCore(0);14 Iterator iterator =set.iterator();15 while(iterator.hasNext()){16 list.add(iterator.next());17 }18 return (ArrayList) list;19 }20 public void PermutationCore(intbegin) {21 if(begin==buffer.length()-1){22 set.add(buffer.toString());23 }24 for(int i = begin;i

26 swap(begin,i);27 PermutationCore(begin+1);28 swap(begin,i);29 }30 }31 public void swap(int i,intj){32 char a =buffer.charAt(i);33 char b =buffer.charAt(j);34 buffer.setCharAt(i, b);35 buffer.setCharAt(j, a);36 }37 }

输入“abc” ,输出:"abc" "acb" "bac" "bca" "cab" "cba"  ; 输入“aaa”,输出"aaa" ,显然符合要求了。

最后我们来看一看TreeSet的层次结构:

类似的结构还有ArrayList,LinkedList,HashSet,HashMap,TreeMap,PriorityQueue,Stack。另外重要的接口有:List,Set,Map,Queue,Deque,Comparator,Comparable,Itrerator。这些都是在编写数据结构和算法的时候经常用到的,尤其需要留意。

java牛客排序算法题_《剑指offer》面试题28:字符串的排列(牛客网版本) java...相关推荐

  1. 算法题001 剑指Offer 面试题三:二维数组中的查找

    剑指Offer题目1:二维数组中的查找 题目描述: http://ac.jobdu.com/problem.php?cid=1039&pid=0 在一个二维数组中,每一行都按照从左到右递增的顺 ...

  2. 剑指Offer - 面试题38. 字符串的排列(全排列,排序,回溯+剪枝)

    1. 题目 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc" 输出:["ab ...

  3. 剑指offer面试题38. 字符串的排列(回溯)

    题目描述 **输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素.** 思路 详见链接 代码 class Solution:def permut ...

  4. java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数

    前言 众所周知,<剑指offer>是一本"好书". 如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白. 对于剑指offer题解这个系列,我的 ...

  5. 剑指offer——面试题28:字符串的排列

    剑指offer--面试题28:字符串的排列 Solution1: 2018年9月2日重做 典型的DFS套路,LeetCode 46 && 47 [46]https://blog.csd ...

  6. 两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字

    今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字. 题目链接:https://leetcode-cn.com/problems/shu-zu-zhon ...

  7. 二维数组的空间复杂度_剑指 offer 面试题精选图解 04 . 二维数组中的查找

    点击关注上方"图解面试算法", 设为"置顶或星标",一起刷 LeetCode. 作者:程序员吴师兄 今天分享的题目来源于 LeetCode 上的剑指 Offer ...

  8. 《剑指Offer》38:字符串的排列

    题目 输入一个字符串,打印该字符中字符的所有排列. 例如,输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串有abc.acb.bac.bca.cab.cba 分析 把一个字符串看成由两 ...

  9. java输出栈的弹出序列_剑指offer:栈的压入、弹出序列(Java)

    1.题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是 ...

最新文章

  1. Hinton等6位图灵奖得主、百余位顶级学者邀你加入群聊,共话人工智能下一个十年...
  2. 兵棋推演有助于我们了解哪些战争知识?
  3. Android TimePicker 不能响应直接输入的问题
  4. R: ggplot2(1)
  5. 刚学会 HTML5 不久,最近用 CSS3 实现了热点地图动画
  6. 20190912:(leetcode习题)3的幂
  7. 北京赛区参赛选手代表吴翼在开幕式上的发言稿完整版2011年11月02日 09:50:34
  8. js导出的xlsx无法打开_遇到U盘无法打开,属性显示0字节这样的问题?数据该如何导出?...
  9. cad迷你画图2020r9安装及使用教程
  10. 什么是智能门锁,智能门锁主要有哪些优点?
  11. 【项目实践】DCGAN绘制理想女朋友照片实践,从爬虫到生产女友
  12. 花生壳域名SSH登录不上的问题
  13. Transformer课程 业务对话机器人Rasa 3.x Reaching Out to the User
  14. 入门 | 走近流行强化学习算法:最优Q-Learning
  15. ROS学习记录(二)玩转海龟——海龟保姆级教程
  16. 华为手机怎么语音服务器,原来华为手机实现文字转语音这么简单!今天才知道,真是绝了...
  17. cip核字号验证_cip核字号(cip数据核字号查询官网)
  18. 微信看看对方是不是把你删除了
  19. 如何使用网易邮箱大师登录网易企业邮箱?
  20. 为有机会进大厂,程序员必须掌握的核心算法有哪些?

热门文章

  1. python的序列包括字符串列表和什么_Python基础:03序列:字符串、列表和元组
  2. linux找回rm的文件夹,Linux rm 文件恢复
  3. matlab_ga(),matlab遗传算法ga函数
  4. linux如何获取raw中的文件路径,如何使用Linux获取Touchscreen Rawdata的坐标
  5. java netty html_源码时代JAVA干货分享|带你用Netty框架实现WebSocket通信
  6. python读取配置文件失败原因_python读取配置文件报keyerror-文件路径不正确导致的错误...
  7. echarts 卡_图表太丑怎么破,ECharts神器带你飞!
  8. JavaScript常用工具类整理(总结版)
  9. 教你玩转CSS border(边框)
  10. vue-router之 beforeRouteEnter