java字符串全排列的实现方式
来源:互联网 发布:last game 软件 编辑:程序博客网 时间:2024/05/01 22:19
转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/17585499
今天突然之间想起了自己来易查面试时的一个笔试题目,题目大致如下:求字符串s的全排列。
其实这个题目的实现方式也就是递归调用,当时也就写了一下伪代码,今天就把完整的实现方式和大家分享下。
下面的实现方式也存在一些小BUG,比如:对于字符串中出现相同的字符是按照不同字符去处理的,当然对于这个BUG可以将程序中的ArrayList<String> 全部修改为 HashSet<String>即可解决,但是自己通过测试,后面的效率明显比第一个低,在实际中,有时候就需要把它们当成不同的字符去对待,自己就偷懒不处理了;第二个BUG就是由于ArrayList<String>数组最大长度的限制,所以现在最大也就只能处理9个长度的字符串,修改这个应该就需要考虑另外的数据结构了。
废话不说了,直接贴出代码:
/** *@Description: 字符串排列问题 */ package cn.lulei.util; import java.util.ArrayList; public class StringPermutation {/** * @param s * @return * @Date: 2013-12-26 * @Author: lulei * @Description: 求字符串的全排列,在测试中,字符长的长度最大为9 * 字符串全排列的实现思想:字符串 s 的全排列是字符串 s 的子串 (s除去第一位的字符组成的字符串)的全排列结果 * 和字符 c (s第一个位置的字符)经过getStr(String s, char c)运算结果,如果 s 长度为 1 这其全排列结果就是本身 * 例如:"abcde" 的全排列结果是 "bcde" 的全排列结果和 'a' 经过getStr(String s, char c)运算得到响应的结果 * 由于在实现过程中使用 ArrayList 造成可以处理的字符串长度 最大只能为 9,在实现过程中,未考虑 s 中有重复字符存在情况 */public static ArrayList<String> getFullPermutation(String s) {if (null == s || "".equals(s)){return null;}ArrayList<String> array = null;if (s.length() == 1){array = new ArrayList<String>();array.add(s);} else {//递归调用array = getFullPermutation(s.substring(1), s.charAt(0));}return array;}/** * @param s * @param c * @return * @Date: 2013-12-26 * @Author: lulei * @Description: 求字符串 s + c 的全排列结果 */public static ArrayList<String> getFullPermutation(String s, char c) {ArrayList<String> reArray = new ArrayList<String>();ArrayList<String> array = getFullPermutation(s);for (String str : array){reArray.addAll(getStr(str, c));}array = null;return reArray;}/** * @param s * @param c * @return * @Date: 2013-12-26 * @Author: lulei * @Description: 将字符 c 插入到字符串的每个位置中 * 如: s = "ab"; c = 'c';得到的结果就是 "cab" "acb" "abc" */public static ArrayList<String> getStr(String s, char c) {ArrayList<String> array = new ArrayList<String>();for (int i = 0; i <= s.length(); i++) {array.add(new StringBuffer().append(s.substring(0, i)).append(c).append(s.substring(i)).toString());}return array;}public static void main(String[] args) {// TODO Auto-generated method stub //,处理9个字符的全排列耗时 ~ 370ms 全排列结果个数 362880String s = "abcdefghi";long a = System.currentTimeMillis();ArrayList<String> array = StringPermutation.getFullPermutation(s);long b = System.currentTimeMillis();System.out.println(s.length() + "个字符串长度全排列耗时:" + (b -a) + "ms");if (array != null){System.out.println(array.size());}}}
自己如果解决了字符串长度限制的这个BUG,会在后面给出相应的blog地址。
0 0
- java字符串全排列的实现方式
- Java实现字符串的全排列
- Java实现的字符串全排列算法
- 全排列字符串java实现
- 字符串全排列 java实现
- 字符串全排列 java实现
- java实现给定字符串之间的全排列算法
- 剑指offer----字符串的全排列----java实现
- 字符串-字符串的全排列-递归实现
- java实现有条件字符串全排列输出
- 字符串全排列问题 java语言实现
- [算法学习]Java实现字符串全排列
- Java递归实现字符串全排列
- Java实现的全排列和排列
- Java实现的全排列和排列
- Java实现的全排列
- 实现字符串全排列
- 实现字符串全排列
- CRC32直接计算法计算字符串校验值示例(VC++)
- 关于Linux系统中“目录项”的解释
- android UI 开源组件
- SQL Server 2000性能测试分析 sql 表最大记录数
- c# 不用IDE编程
- java字符串全排列的实现方式
- HelloServlet
- source insight 里编辑的时候,每次粘贴后,光标停留在粘贴内容的左面
- Leetcode Binary Tree Zigzag Level Order Traversal
- 使用isolinux制作liveUSB
- 组织结构图 可以任意拖拽的div
- Struts2下载zip压缩文件-不生成临时文件
- Linux多节点互信配置
- Android源码结构