博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串的排列
阅读量:5320 次
发布时间:2019-06-14

本文共 1385 字,大约阅读时间需要 4 分钟。

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

 

public ArrayList
Permutation(String str) { ArrayList
result = new ArrayList
(); if (str == null || str.length() > 9 || str.length()==0) { return result; } str = str.trim(); Permutation(str.toCharArray(), 0, result);// HashSet
hs = new HashSet
(result); //此仅去重,没有字典序排列,可能错误// new ArrayList
(hs); Collections.sort(result); //字典序排列 有些oj要求 return result; } public static void Permutation(char[] data, int beginIdx,ArrayList
result) { if (beginIdx == data.length) { result.add(new String(data)); } else { for (int i = beginIdx; i < data.length; ++i) { //有重复字符时,跳过 if(i!=beginIdx && data[i]==data[beginIdx]) continue; //当i==begin时,也要遍历其后面的所有字符; //当i!=begin时,先交换,使第begin位取到不同的可能字符,再遍历后面的字符 char temp = data[beginIdx]; data[beginIdx] = data[i]; data[i] = temp; Permutation(data, beginIdx + 1, result); //为了防止重复的情况,还需要将begin处的元素重新换回来 恢复打扫战场,恢复为原来子串, data共享 temp = data[beginIdx]; data[beginIdx] = data[i]; data[i] = temp; /* 举例来说“b(acd)” acd排列 ,为什么使用了两次swap函数? 函数栈变化恢复 , "acd第一次输出 cda后,完全退栈 返回data应该还是acd" 交换栈 退栈 bacd bacd bcad bcad bcda 打印 -> bcda */ } } }

  

转载于:https://www.cnblogs.com/yangsy0915/p/4990176.html

你可能感兴趣的文章
sqlserver 判断字符串是否是数字
查看>>
[HNOI2011 任务调度]
查看>>
前端JS开发框架-DHTMLX--dhtmlXTree
查看>>
vue 组件中数组的更新
查看>>
cf860E Arkady and A Nobody-men (树剖)
查看>>
luogu5020 [NOIp2018]货币系统 (完全背包)
查看>>
BZOJ 3648: 寝室管理( 点分治 + 树状数组 )
查看>>
BZOJ 4011: [HNOI2015]落忆枫音( dp )
查看>>
第三届 CSS 开发者大会笔记
查看>>
Linux_jdk安装和配置
查看>>
001 初入iOS客户端测试
查看>>
Codeforces Round #401 (Div. 2) 离翻身就差2分钟
查看>>
便利构造器、单件模式
查看>>
jQueryDOM操作模块(二)
查看>>
[poj] 3977 Subset || 折半搜索MITM
查看>>
单例设计模式---懒汉式的多线程安全隐患
查看>>
JSP复习整理(四)Cookie
查看>>
poj 2109Power of Cryptography
查看>>
iphone传照片还是用QQ比较好
查看>>
金额数字3位分割
查看>>