`
功夫小当家
  • 浏览: 183290 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

含有重复字符的字符数组的全排列

阅读更多

试中遇到了3次这道题,题目大致是这样的:请编写代码实现有重复元素的全排列问题  。

整理了下思路,写了个java代码, 这个代码既可以针对有重复元素的全排列,又可以针对无重复元素的全排列

public class repeatAllArray {
 /*
  * allArray实现含有重复字符的数组的全排列
  * list是含重复字符的数组,i是指示当前位置的游标,length是数组长度
  * 注释:这个函数最核心的地方,我感觉是else块的代码
  */
 public void allArray(char list[], int i, int length) {
  if (i == length - 1) {
   for (int j = 0; j < length; j++) {
    System.out.print(list[j]);
   }
   System.out.println();
  } else {
   for (int j = i; j < length; j++) {
    if (!isExist(list, i, j)) {
     swap(list, i, j);// 交换当前值和当前位置之后的值
     allArray(list, i + 1, length);// 当前位置+1,递归
     swap(list, i, j);// 再交换
    }
   }
  }
 }
 
    /*
     * isExist判断j位置的字符是否已经在list[0]~list[j-1]中出现过了
     * list是含重复字符的数组,i是指示当前位置的游标,j是要判断的字符的位置
     */
 public boolean isExist(char list[], int i, int j) {
  for (int k = i; k < j; k++) {
   if (list[j] == list[k]) {
    return true;
   }
  }
  return false;
 }

 /*
  * swap实现了数组中两个位置的值的交换
  * list是含重复字符的数组,i,j表示要交换的位置
  */
 public void swap(char list[], int i, int j) {
  char temp = list[i];
  list[i] = list[j];
  list[j] = temp;
 }

 public static void main(String[] args) {
  char a[] = { 'a', 'a', 'b', 'b' };//以这个字符数组为例
  repeatAllArray array = new repeatAllArray();
  array.allArray(a, 0, a.length);
 }

}

分享到:
评论
4 楼 功夫小当家 2012-10-18  
那个,建议一下楼主下次发代码要用插入代码,不要直接粘贴,直接粘贴的代码不能收藏啊

好的,谢谢你的建议~
3 楼 Chris_bing 2012-10-17  
那个,建议一下楼主下次发代码要用插入代码,不要直接粘贴,直接粘贴的代码不能收藏啊

应该这样:
public class repeatAllArray {
 /*
  * allArray实现含有重复字符的数组的全排列
  * list是含重复字符的数组,i是指示当前位置的游标,length是数组长度
  * 注释:这个函数最核心的地方,我感觉是else块的代码
  */
 public void allArray(char list[], int i, int length) {
  if (i == length - 1) {
   for (int j = 0; j < length; j++) {
    System.out.print(list[j]);
   }
   System.out.println();
  } else {
   for (int j = i; j < length; j++) {
    if (!isExist(list, i, j)) {
     swap(list, i, j);// 交换当前值和当前位置之后的值
     allArray(list, i + 1, length);// 当前位置+1,递归
     swap(list, i, j);// 再交换
    }
   }
  }
 }
 
    /*
     * isExist判断j位置的字符是否已经在list[0]~list[j-1]中出现过了
     * list是含重复字符的数组,i是指示当前位置的游标,j是要判断的字符的位置
     */
 public boolean isExist(char list[], int i, int j) {
  for (int k = i; k < j; k++) {
   if (list[j] == list[k]) {
    return true;
   }
  }
  return false;
 }
 /*
  * swap实现了数组中两个位置的值的交换
  * list是含重复字符的数组,i,j表示要交换的位置
  */
 public void swap(char list[], int i, int j) {
  char temp = list[i];
  list[i] = list[j];
  list[j] = temp;
 }
 public static void main(String[] args) {
  char a[] = { 'a', 'a', 'b', 'b' };//以这个字符数组为例
  repeatAllArray array = new repeatAllArray();
  array.allArray(a, 0, a.length);
 }
}


2 楼 功夫小当家 2012-10-17  
Chris_bing 写道
带重复的全排列居然就比不带重复的全排列多了一个判断条件...我之前想了好久啊!

恩,得去重,要不然会多算
1 楼 Chris_bing 2012-10-17  
带重复的全排列居然就比不带重复的全排列多了一个判断条件...我之前想了好久啊!

相关推荐

    Java实现字符数组全排列的方法

    主要介绍了Java实现字符数组全排列的方法,涉及Java针对字符数组的遍历及排序算法的实现技巧,需要的朋友可以参考下

    C#求数组中元素全排列的方法

    主要介绍了C#求数组中元素全排列的方法,较为详细的分析了数组全排列算法的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    python 数据结构 算法 LeetCode 牛客 面试 编程之美 动态规划 字典树 快速排序 树 字符串 数组 链表 全排列

    树 * 字典树 * 遍历-层次遍历 * 遍历-中序遍历-非递归 * 遍历-前序遍历-非递归 * 遍历-后序遍历-非递归 * 二叉查找树-两数之和 ...数组&字符串 查找排序 排列组合 动态规划 树 链表 数学 位运算 编程之美

    php求数组全排列,元素所有组合的方法

    主要介绍了php求数组全排列,元素所有组合的方法,涉及php针对数组与字符串的分割、遍历、数学运算等技巧,需要的朋友可以参考下

    数据结构 n个数的全排列

    如果输入123,那么就会输出123,132,213,231,312,321,依次列推

    Java编写八皇后与全排列只差三个字符

    只用了一维长度为9的数组 全排列问题可以看做简化规则的八皇后问题噢!!

    Golang排列组合算法问题之全排列实现方法

    本文实例讲述了Golang排列组合算法问题之全排列实现方法。分享给大家供大家参考,具体如下: 【排列组合问题】 一共N辆火车(0&lt;N&lt;10),每辆火车以数字1-9编号,要求以字典序排序输出火车出站的序列号。 输入:...

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

    你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。 示例: 输入:s = "abc" 输出:["abc","acb","bac","bca","cab","cba"] 限制: 1 &lt;= s 的长度 &lt;= 8 来源:力扣(LeetCode) 链接:...

    Java递归实现字符串全排列与全组合

    主要为大家详细介绍了Java递归实现字符串全排列与全组合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    实用的utility function.zip

    table 复写pairs方法.lua 实现数组的全排列.lua table数组的逆序.lua 将csv内容输出保存table.lua 以delimiter截取字符串输出table.lua 将全局变量替换其value.lua 判定return是否包含某匹配字串.lua 将数组元素...

    LeetCode解题总结

    1.1 从有序数组中删除重复元素 1.2 在排序数组被旋转后进行查找 1.3 寻找两个排序数组的中位数 1.4 最长连续序列 1.5 累加和 1.6 移除数组中指定值 1.7 下一个排列 1.8 第n个全排列 1.9 验证数独的正确性 1.10 容纳...

    leetcode跳跃-subond::squid:LeetCodeGo题解,每周日更新

    无重复字符的最长子串 7 整数反转 数组 8 字符串转整型 string 9 Palindrome Number 11 盛最多水的容器 中等 数组 14 最长公共前缀 15 三数之和 19 Remove Nth Node From End of List 中等 链表 20 有效的字符串/...

    python 数据结构 算法 LeetCode 牛客 面试 编程之美 动态规划 字典树等等

    python 数据结构 算法 LeetCode 牛客 面试 编程之美 动态规划 字典树 快速排序 树 字符串 数组 链表 全排列 堆排序 位运算 大数相加

    leetcode答案-leetcode:leetcode

    1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现? 一个数组存放若干整数,一个数...

    LeetCode判断字符串是否循环-leetcode-js:我用JavaScript编写的leetcode答案

    无重复字符的最长子串 中等 4 寻找两个有序数组的中位数 困难 7 整数反转 简单 8 字符串转换整数(atoi) 中等 9 回文数 简单 11 盛最多水的容器 中等 14 最长公共前缀 简单 15 三数之和 中等 16 最接近的三数之和 ...

    leetcode中文版-Algorithm:力码

    求数组子集(含重复元素) Array 152 最大子数组乘积 DP 165 版本号比较 String 165 偷东西 DP 219 重复元素判断 Array 234 回文链表判断 LinkedList 234 DFS路径 DFS 434 字符串分段数 String 459 字符串是否由子串...

    程序员编程艺术:面试和算法心得.pdf

    第一章 字符串 o 1.0 本章导读 o 1.1 旋转字符串 o 1.2 字符串包含 o 1.3 字符串转换成整数 o 1.4 回文判断 o 1.5 最长回文子串 o 1.6 字符串的全排列 o 1.10 本章习题 第二章 数组 o 2.0 本章导读 o 2.1 寻找最小的...

    javalruleetcode-leetcode:力扣算法题解

    无重复字符的最长子串 字符串转换整数 盛水最多得容器 括号生成 搜索旋转排序数组 全排列 跳跃游戏 合并区间 LRU缓存机制 翻转字符串里的单词 二叉树的右视图 岛屿数量 数字范围按位与 生命游戏 设计推特 水壶问题 ...

    python非递归全排列实现方法

    结合数组操作,写了个非递归的全排列生成。原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位置插入,生成n+1个新的全排列。因为Python切割数组或者字符串,以及合并比较...

Global site tag (gtag.js) - Google Analytics