`
功夫小当家
  • 浏览: 186492 次
  • 性别: 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#编程中,求解数组元素全排列是一项常见的任务,尤其在算法设计和数据处理领域。全排列是指从n个不同元素中取出m个元素,按照一定的顺序排成一列的所有可能组合,其中m≤n。在这个问题中,我们讨论的是如何在C#中...

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

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

    python常规方法实现数组的全排列

    然后将输入的字符串转换为整数列表,并调用`perm`函数输出所有全排列。 在实际应用中,全排列问题可以用于各种场景,例如生成所有可能的密码组合、解决组合优化问题或在组合数学中分析可能的事件序列。了解如何有效...

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

    在这个问题中,我们有一个名为$source的数组,包含字符串元素'pll'、'我'、'爱'、'你'和'嘿'。我们的目标是生成并打印出这个数组的所有可能排列。 在PHP中,可以使用回溯法(Backtracking)或基于比较的排序算法来...

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

    在Golang中实现全排列算法主要是为了解决排列组合问题,特别是在处理字符串或数组时,例如在上述例子中,需要对一组数字进行字典序排序并输出所有可能的排列。全排列算法是找出一个序列中所有可能的排列方式,且每个...

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

    数组全排列是指将数组中的元素按不同顺序重新组合,形成所有可能的排列方式。而元素所有组合则是指从数组中取出任意数量的元素,形成所有可能的组合。本知识点将详细介绍如何用PHP实现这两个功能,同时涵盖数组的...

    数据结构 n个数的全排列

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

    js实现字符全排列算法的简单方法

    在编写JavaScript代码时,实现字符的全排列是一个常见的算法问题,它涉及到组合数学中的排列组合知识。所谓全排列,是指将一个字符串中的所有字符进行重排,得到所有可能的排列组合。在给定的文件内容中,提供了一个...

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

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

    java实现字符串的全排列

    在swap方法中,我们使用了字符数组的交换操作,来交换两个字符的位置。 java实现字符串的全排列可以使用递归思想和TreeSet来实现。通过将需要全排列的字符串分为两部分,并对第一个字符和后面的字符进行交换,可以...

    PHP实现字符串的全排列详解

    关于代码的运行过程,首先是初始化一个空的结果数组`$res`,然后调用`test`函数,从字符串的首字符开始全排列。在每一步递归中,会打印出当前字符串和起始位置,以帮助理解递归树的生成过程。递归树是深度优先搜索树...

    数据结构和算法:字符串

    在某些编程语言中,字符串可能以字符数组的形式存储,而在另一些语言中则可能是一个内置的数据类型。此外,对字符串的遍历、比较以及修改操作等都可能影响算法的实现和效率。 总的来说,字符串处理是计算机编程中的...

    输入一个字符串,输出所有该字符串的组合情况

    - `TestPermute.java`:可能实现了字符串的全排列算法,并命名为`permute`方法。 - `Test2.java`:可能是对另一种算法的实现,比如改进或优化过的版本。 - `Test.java`:通常用于编写单元测试,检验各种输入情况下,...

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

    "Java递归实现字符串全排列与全组合" Java递归实现字符串全排列与全组合是指使用Java语言通过递归算法实现字符串的全排列和全组合。全排列是指将字符串中的所有元素按照一定的顺序进行排列,而全组合是指将字符串...

    算法实践:全排列(递归)

    然后,对每一个首位字符的排列,再选择下一个字符,重复这个过程,直到所有字符都被选择过。 以下是一个简单的递归函数实现全排列的逻辑: 1. 如果已经到达字符串的末尾(position == end),说明当前的排列是一个...

    qpl.rar_CC_全排列_输入全排列

    在C++代码中,可能会定义一个函数如`permute(char* str, int start, int end)`,其中`str`是原始字符数组,`start`是当前处理的位置,`end`是字符数组的结束位置。递归函数内部将遍历从`start`到`end`的所有字符,...

    (ABCDE)字符串排序

    这种排列通常涉及到计算机科学中的全排列算法,尤其是在处理字符串或数组时。 标签 "permutation" 指出该主题的核心是全排列。全排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列的所有可能的...

Global site tag (gtag.js) - Google Analytics