`
lg_asus
  • 浏览: 191770 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

打印出一个字符串的全排列(重复的只计算一次)

 
阅读更多
给定hello则它的全排列共有 5*4*3*2*1/ (2*1)=60种。

思想(先不考虑去重复):
首先取第一个字符如h,然后计算剩下4个字符ello的全排列,然后再将h和这些全排列相加就OK了,然后再取第二个... 第三个...,典型的循环+递归思想。
如果要去重,可以考虑先将整个字符串排序,hello -> ehllo,在循环的时候,首先判断当前字符和前一个字符是否相同,如果相同则说明这个字符已经处理,跳过即可。

java code:
@Test
	public void run()
	{
		String str = "hello";
		char[] array = str.toCharArray();
		Arrays.sort(array);
		List<String> result = this.compose(array);
		System.out.println(result.size());
		for (String s : result)
		{
			System.out.println(s);
		}
	}

	private List<String> compose(char[] array)
	{
		List<String> result = new LinkedList<String>();
		if (array.length == 1)
		{
			result.add(String.valueOf(array[0]));
			return result;
		}
		for (int i = 0; i < array.length; i++)
		{
			char ch = array[i];
			//if the current character is the same with previous one, it means this character has been arranged, skip it
			if (i > 0 && ch == array[i - 1])
			{
				continue;
			}
			List<String> subList = this.compose(this.getSubarray(array, i));
			for (String str : subList)
			{
				result.add(String.valueOf(ch) + str);
			}
		}
		return result;
	}

	private char[] getSubarray(char[] array, int exclude)
	{
		char[] sub = new char[array.length - 1];
		System.arraycopy(array, 0, sub, 0, exclude);
		System.arraycopy(array, exclude + 1, sub, exclude, array.length - exclude - 1);
		return sub;
	}


复杂度: N!
分享到:
评论

相关推荐

    重复元素全排列

    为了避免重复计算,可以使用一个辅助函数`Judge()`来判断当前元素是否已经出现在生成的子序列中,如果已经出现,则跳过此次交换,避免重复计算。 #### 知识点三:代码解析 1. **输入与输出**: - 程序首先从用户...

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

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

    关于全排列算法

    代码的核心在于`pai`函数,它是一个递归函数,用于生成字符串`str`的全排列。`chang`函数则是用来执行字符串的循环左移操作。 1. `chang(char str[], int m)`函数:这个函数接收一个字符串`str`和一个整数`m`作为...

    全排列算法

    - 字符串操作:找出字符串的所有字符重排组合。 - 棋盘游戏:计算棋子的所有可能布局。 - 测试用例生成:在自动化测试中生成所有可能的输入组合。 7. **注意事项**: - 当处理大数组时,全排列的计算量会非常大...

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

    - `PrintFullPermutation`:这是一个主函数,负责处理输入数组的合法性检查、创建临时数组并对其进行升序排列,然后调用`FindNextArray`和`PrintArray`来打印全排列。 - `PrintArray`:用于打印数组的当前排列,便于...

    《剑指Offer》题目及代码.pdf

    28. 打印字符串中所有字符的排列:涉及到字符串的全排列问题,通常使用递归或交换的方式实现。 29. 数组中出现次数超过一半的数字:这是一个统计问题,可以考虑摩尔投票算法来解决。 30. 找出最小的K个数:可以...

    范围上尝试模型1

    2. **字符串子序列**:打印一个字符串的所有子序列,意味着要列出所有可能的子串,包括空字符串本身。 3. **无重复字符的子序列**:在此基础上增加了一个限制,即子序列中不允许有重复的字符。 4. **字符串排列**...

    2017程序员迅雷笔试题

    利用递归,通过固定一个字符的位置,然后对剩余的字符进行全排列,最后打印出所有的排列组合。 - 分析了猴子携带香蕉的问题,考虑了每次最多能携带数量以及每次行进消耗的逻辑,形成了一个经典的动态规划问题,需要...

    LeetCode解题总结

    13.3 字符串的所有子回文字符串 13.4 最长公共子序列问题 13.5 字符串的编辑距离 13.6 不同路径之和 13.6.1 无障碍13.6.2 有障碍 13.7 最大矩形面积 13.8 字符串交叉组合 13.9 旋转字符串 13.10 最小路径和 13.11 ...

    蓝桥杯java历年真题及答案整理(共129道题目及答案)

    文件中的`Question1`类通过递归的方式实现了一个向量(Vector)内元素的所有可能的排列组合,并通过打印输出所有排列。这是一个经典的全排列问题,通常在算法竞赛和编程实践中会遇到。在此类问题中,要注意递归终止...

    蓝桥杯历年真题及答案.pdf

    7. 字符串处理:在文档的一个代码示例中,演示了如何对字符串进行处理,例如去除重复字符并将处理后的字符存放到列表中。字符串是计算机科学中常用的数据类型,涉及到字符的增删改查等操作。 8. 递归算法的实现:...

    24游戏功能完备版

    然后再用一个3重循环 填写3个空缺位置的运算符 每构造出一种情况就检测一次 如果结果等于24 就打印 "&gt;主要思想: 序言:关于扑克牌的表示 由于扑克牌中有一张牌是10 两位 字符串表示起来有些麻烦 当我们检测到...

    微软Java面试题汇总(最新)

    - **字符串全排列**: - 可以使用递归方法,固定第一个字符,对其余字符进行全排列,然后依次选择下一个字符作为新的固定字符重复此过程。 - **模拟 malloc 函数**: - 实现内存分配逻辑,如首次适应法、最佳适应...

    C语言100例

    在第一个程序示例中,题目要求找出1、2、3、4这四个数字可以组成多少个互不相同且无重复数字的三位数。这是一个典型的组合问题,可以通过编程实现全排列,并排除不符合条件的排列。程序分析中提到,可以用这四个数字...

    java 算法设计

    `removeDuplicate`函数用于移除输入字符串中的重复字符,将其存储在Set中以保持唯一性。`convert`函数将Set转换为List,便于后续处理。`check`函数则用于检查Set中的字符组合,但由于代码未完全显示,我们无法看到其...

    流程控制语句编程.doc

    【程序 7】是统计输入字符串中各类型字符数量的题目,可以使用while循环和条件判断,遍历字符串中的每个字符,分别计数。 【程序 8】要求计算由数字a组成的特定序列的和。使用循环累加每个项的值,关键在于计算每一...

    算法精选,各种的

    **程序3** 需要统计输入字符串中的不同类型字符数量,这涉及到字符串处理和条件判断。通过使用循环结构和字符类别判断,可以高效地完成统计任务。 ### 数字序列求和 **程序4** 中,求解特定形式的数字序列的和,...

    算法作业内容要求

    递归方法通常是选择一个元素固定,然后递归地生成剩余元素的所有排列,最后再移动固定元素的位置重复此过程。非递归方法则往往涉及循环和交换元素的操作,例如著名的Johnson-Trotter算法或Steinhaus-Johnson-Trotter...

    cpp代码-有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

    我们可以创建一个函数,接受剩余未使用的数字集合和当前构建的数字字符串作为参数,每次递归调用时选择一个未使用过的数字添加到结果字符串,然后将剩下的数字集合和更新后的字符串传递给下一次调用。这种方法更灵活...

    201909全国青少年软件编程(python)等级考试试卷(一级).docx

    2. 编辑Python程序的软件:IPython是一个增强交互式Python shell,Jupyter Notebook则是一个支持多种语言的交互式计算环境,它们都可以编辑Python程序。而Scratch标准版是一个面向儿童的图形化编程工具,不适合编辑...

Global site tag (gtag.js) - Google Analytics