【剑指offer-Java版】28字符串的排列
2016-04-26 11:31
411 查看
字符串的全排列:全排列问题刚刚做过,而且解决方法不止一种
递归,多想想
测试代码
递归,多想想
public class _Q28<T> { private int count = 0; public void Premutation(char chars[], int begin){ if(chars == null) return; if(chars.length == 0 || begin < 0) return; int end = chars.length - 1; if(begin == end){ count++; System.out.print(count+" : "); System.out.println(chars); }else{ for(int i=begin; i<=end; i++){ char c = chars[begin]; // 第一步,找出所有可以出现在首位的字符 chars[begin] = chars[i]; chars[i] = c; Premutation(chars, begin+1); // 第二步,递归的求出后半部分的全排列 c = chars[begin]; chars[begin] = chars[i]; // 第一步的后半部分,恢复数组 chars[i] = c; } } } /** * * @comment TODO * @param chars * @param m 排列的长度 -- 如果需要输出指定字符数组的全排列,那么直接使用for循环,使m 从0到数组长度即可 * @param result 排列结果链表 * @return void * @throws * @date 2016年4月16日 下午4:20:57 */ public void Combination(char chars[], int m, List<Character> result){ if(chars == null || result == null) return; if(m == 0){ System.out.println(result); return; } if(chars.length > 0){ // 包含当前第一个字符 -- 从剩下的字符中选出 m-1个 result.add(chars[0]); Combination(Arrays.copyOfRange(chars, 1, chars.length), m-1, result); // 不包含当前第一个字符 -- 从剩下的字符中选出m 个 result.remove(result.size()-1); Combination(Arrays.copyOfRange(chars, 1, chars.length), m, result); } } }
测试代码
public class _Q28Test extends TestCase { _Q28 premutation = new _Q28(); public void test(){ String str = "abcd"; char chars[] = str.toCharArray(); premutation.Premutation(chars, 0); List<Character> result = new ArrayList<>(); premutation.Combination(chars, 2, result); } }
相关文章推荐
- 【剑指offer-Java版】27二叉搜索树与双向链表
- html获取自定义属性值
- jquery.easyui添加表单验证
- 【剑指offer-Java版】26复杂链表的复制
- 【剑指offer-Java版】25二叉树中和为某一值的路径
- 【剑指offer-Java版】24二叉搜索树后序遍历序列
- 最详细的JavaScript和事件解读
- 【剑指offer-Java版】23从上往下打印二叉树
- \0 导致JSON无法解析的问题
- 【剑指offer-Java版】22栈的压入弹出序列
- js刷新页面方法大全
- js对字符串的处理--查找,合并,截取
- Extjs4中up()和down()的用法
- 【剑指offer-Java版】21包含min函数的栈
- ExtJs xtype一览
- jQuery与JavaScript入门经典——AJAX
- JSTL标签库大全
- Chrome 调试动态Javascript
- JSTL标签用法 详解
- 几种常用JQuery插件介绍