`
ybhuxiao
  • 浏览: 192826 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

算法:输出一串字符的全排列

    博客分类:
  • java
阅读更多
package test;

import java.util.ArrayList;
import java.util.List;

public class Test {

	public static void main(String[] args) {
		String str = "abcdef";
		List<String> list = new Test().completeArray(str, 0);
		
		System.out.println(list);
		System.out.println("there are " + list.size() + " kinds of groups.");
	}

	public List<String> completeArray(String str, int index) {
		if (index == str.length() - 1) {
			List<String> list = new ArrayList<String>();
			list.add(String.valueOf(str.charAt(index)));
			return list;
		}
		
		List<String> newLists = new ArrayList<String>();
		List<String> oldLists = completeArray(str, index + 1);
		
		for (String oldString : oldLists) {
			char c = str.charAt(index);
			for (int i = 0; i <= oldString.length(); i++) {
				newLists.add(Insert2Str(oldString, i, c));
			}
		}
		return newLists;
	}

	private String Insert2Str(String str, int i, char c) {
		if(str == null){
			return String.valueOf(c);
		}else {
			return str.substring(0, i) + c + str.substring(i);
		}
	}
}



思路是递归,要取str的全排列,只要取后n-1位的全排列,再把第1位往里面插入,就ok了。递归的终止是,游标index扫描到最后一位,只有一个字母的时候排列之后一种,开始return

产生新字符串那地方,刚开始的时候用ArrayList的add方法,但是这样的话有太多的转换类型操作,代码显得很乱,看着很不爽,就写了一个Insert2Str的方法,往字符换的指定位置插入一个字符。

代码存在效率问题,大概到8个字母以上运行就很慢了,10几位的话会报java.lang.OutOfMemoryError异常,求问题所在,和更好的算法


分享到:
评论
5 楼 reilost 2010-05-28  
话说...10几位的放list里-.-怎么会不溢出...
12位就已经479001600了
4 楼 reilost 2010-05-28  
囧,某公司的笔试是数字还有限制条件...直接把代码改了下....

	public static StringBuilder sb = null;
	public static Set<String> resultSet = new HashSet<String>();

	public static void main(String args[]) {
		char a[] = "abcdef".toCharArray();
		build(a, 0, a.length);
	}

	public static void build(char[] arr, int k, int m) {
		if (k == m) {
			for (int i = 0; i < arr.length; i++) {
				if (sb == null)
					sb = new StringBuilder();
				sb.append(arr[i]);
			}
			resultSet.add(sb.toString());
			sb.delete(0, sb.length());
		} else {
			for (int i = k; i < m; i++) {
				swap(arr, k, i);
				build(arr, k + 1, m);
				swap(arr, k, i);
			}
		}
	}
	public static void swap(char[] arr, int i, int j) {
		char tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;

	}
3 楼 cjjer 2010-05-27  
        static List<string> GetString(string x)
        {
            List<string> ls = new List<string>();
            if (x.Length.Equals(1))
            {
                ls.Add(x);
            }
            else
            {
                string z = x;
                foreach (char i in x)
                {
                    foreach (string si in GetString(z.Replace(i.ToString(), "")))
                    {
                        ls.Add(i.ToString() + si);
                    }

                }
            }
            return ls;
        }


前几天写的。
是c#的,顺手贴。

超过11位也算起来就慢的很。

11 All.Count 3628800 int
这个差不多5秒左右了。



2 楼 raito_yagami 2010-05-27  
能描述一下问题么?
1 楼 liuzhiqiangruc 2010-05-26  
关注学习。。。

相关推荐

    求字符串的全排列

    在编程领域,字符串的全排列是一个经典的问题,它涉及到算法和数据结构的知识。在这个问题中,我们被要求找出一个字符串中所有可能的字符排列组合。这个任务通常可以通过回溯算法或者堆栈等方法来实现。这里我们将...

    CC++全排列..1--n的全排列以及字符串的全排列

    在这个文件中,我们将讨论CC++中生成从1到n的全排列算法,以及字符串的全排列算法。 一、生成从1到n的全排列算法 这个算法的思想是使用递增的方式生成从1到n的所有排列。具体来说,算法的步骤如下: 1. 输入n 2. ...

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

    它创建了一个包含 'a', 'b', 'c' 的字符数组,并调用 `permutation` 进行全排列,最后输出所有可能的排列组合。 运行 `testPermutation`,你会看到如下输出: ``` abc acb bac bca cab cba ``` 这正是 'a', 'b', 'c...

    Python字符串的全排列算法实例详解

    在本篇文章中,我们将通过一个具体的例子来详细介绍如何使用Python语言实现字符串的全排列算法,并深入探讨其中的细节。 #### 二、全排列的基本概念 全排列是指在一个集合中取出所有元素的所有不同排列方式。例如,...

    数据结构和算法:字符串

    另一个字符串处理的经典问题是字符串的全排列,即给定字符串S[0…N-1],设计算法枚举S的全排列。解决全排列问题可以使用递归算法或非递归算法。递归算法通常基于分治法的思想,通过逐个交换字符来生成新的排列,保证...

    输出n个字符的全排列(没有重复字符)

    简单的实现,代码很短。...输入一个字符串,输出它的字符的所有组合的情况 如输入“abc”,则输出abc,acb,bac,bca,cab,cba。 但如果输入“aba”,即有重复的,也会输出aba,aab,baa,baa,aba,aab。

    字符串的全排列和组合算法.doc

    字符串的全排列和组合算法是计算机科学中的一种基础算法,主要应用于数据处理和问题求解。在本文档中,我们将探讨如何使用C++实现字符串的全排列算法,并讨论如何处理包含重复字符的情况。 首先,全排列是指从一个...

    C++字符串的全部排列

    在C++编程中,字符串的排列是一个经典的算法问题,它涉及到字符串处理和组合数学的知识。字符串的排列是指从给定的字符集合中选取字符,并按照不同的顺序排列它们,生成所有可能的不同序列。在这个问题中,我们需要...

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

    标题 "输入一个字符串,输出所有该字符串的组合情况" 涉及的主要知识点是字符串处理和算法,特别是组合和排列的生成。在这个问题中,我们需要编写程序来生成一个给定字符串的所有可能的子序列或子字符串,这通常涉及...

    使用C语言解决字符串全排列问题

    例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路 这是典型的递归求解问题,递归算法有四个特性: 必须有可达到的终止条件,否则程序陷入死循环 子问题在规模上...

    生成字符串的全排列,可以用回溯法实现

    在编程领域,生成字符串的全排列是一个常见的问题,它涉及到算法设计和计算机科学的基本概念。回溯法是一种解决此类问题的有效方法,它通过尝试所有可能的解决方案并逐步撤销那些不符合条件的尝试,来找到所有正确...

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

    给定一个字符串,全排列的任务是找出所有可能的字符顺序,其中每个字符都恰好出现一次。在本例中,字符串仅包含小写字母,并且长度在2到8之间。 解决全排列问题通常采用递归方法。递归的基本思想是将复杂的问题分解...

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

    在给定的文件内容中,提供了一个在JavaScript中实现字符全排列算法的简单方法。 具体算法思路是利用递归和正则表达式来实现。首先,函数charsMap接收一个字符串参数o,然后对这个字符串进行处理,去除其中的重复...

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

    在全排列问题中,我们希望找到一个字符串中所有字符的全排列,并按字典序排列。对于输入的字符串abc,其所有可能的排列为abc, acb, bac, bca, cab, cba。 要实现这个功能,可以采用以下步骤: 1. 从字符串的第0个...

    字符串面试题整理

    - 问题1:字符串的全排列,可以通过回溯算法实现,每次选择未使用的字符并递归到下一层。 - 问题2:字符串的组合,可以使用递归或者动态规划。递归方法中,每次可以选择使用当前字符或者跳过它。 5. **打靶问题**...

    python3实现字符串的全排列的方法(无重复字符)

    求任意一个字符串的全排列组合,例如a=’123′,输出 123,132,213,231,312,321。(暂时假定字符串没有重复) 解决方案 目前有两种解决的方法 方法一: def str_sort(s=''): if len(s) &lt;= 1: return [s]...

    全排列算法

    全排列算法是计算机科学中一个重要的算法,主要应用于数据处理、搜索优化以及组合问题等领域。在编程中,全排列通常是指从给定的n个不同元素中,按照一定的顺序取出所有可能的排列组合。这种算法涉及到的主要知识点...

Global site tag (gtag.js) - Google Analytics