给定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. **注意事项**: - 当处理大数组时,全排列的计算量会非常大...
- `PrintFullPermutation`:这是一个主函数,负责处理输入数组的合法性检查、创建临时数组并对其进行升序排列,然后调用`FindNextArray`和`PrintArray`来打印全排列。 - `PrintArray`:用于打印数组的当前排列,便于...
28. 打印字符串中所有字符的排列:涉及到字符串的全排列问题,通常使用递归或交换的方式实现。 29. 数组中出现次数超过一半的数字:这是一个统计问题,可以考虑摩尔投票算法来解决。 30. 找出最小的K个数:可以...
2. **字符串子序列**:打印一个字符串的所有子序列,意味着要列出所有可能的子串,包括空字符串本身。 3. **无重复字符的子序列**:在此基础上增加了一个限制,即子序列中不允许有重复的字符。 4. **字符串排列**...
利用递归,通过固定一个字符的位置,然后对剩余的字符进行全排列,最后打印出所有的排列组合。 - 分析了猴子携带香蕉的问题,考虑了每次最多能携带数量以及每次行进消耗的逻辑,形成了一个经典的动态规划问题,需要...
13.3 字符串的所有子回文字符串 13.4 最长公共子序列问题 13.5 字符串的编辑距离 13.6 不同路径之和 13.6.1 无障碍13.6.2 有障碍 13.7 最大矩形面积 13.8 字符串交叉组合 13.9 旋转字符串 13.10 最小路径和 13.11 ...
文件中的`Question1`类通过递归的方式实现了一个向量(Vector)内元素的所有可能的排列组合,并通过打印输出所有排列。这是一个经典的全排列问题,通常在算法竞赛和编程实践中会遇到。在此类问题中,要注意递归终止...
7. 字符串处理:在文档的一个代码示例中,演示了如何对字符串进行处理,例如去除重复字符并将处理后的字符存放到列表中。字符串是计算机科学中常用的数据类型,涉及到字符的增删改查等操作。 8. 递归算法的实现:...
然后再用一个3重循环 填写3个空缺位置的运算符 每构造出一种情况就检测一次 如果结果等于24 就打印 ">主要思想: 序言:关于扑克牌的表示 由于扑克牌中有一张牌是10 两位 字符串表示起来有些麻烦 当我们检测到...
- **字符串全排列**: - 可以使用递归方法,固定第一个字符,对其余字符进行全排列,然后依次选择下一个字符作为新的固定字符重复此过程。 - **模拟 malloc 函数**: - 实现内存分配逻辑,如首次适应法、最佳适应...
在第一个程序示例中,题目要求找出1、2、3、4这四个数字可以组成多少个互不相同且无重复数字的三位数。这是一个典型的组合问题,可以通过编程实现全排列,并排除不符合条件的排列。程序分析中提到,可以用这四个数字...
`removeDuplicate`函数用于移除输入字符串中的重复字符,将其存储在Set中以保持唯一性。`convert`函数将Set转换为List,便于后续处理。`check`函数则用于检查Set中的字符组合,但由于代码未完全显示,我们无法看到其...
【程序 7】是统计输入字符串中各类型字符数量的题目,可以使用while循环和条件判断,遍历字符串中的每个字符,分别计数。 【程序 8】要求计算由数字a组成的特定序列的和。使用循环累加每个项的值,关键在于计算每一...
**程序3** 需要统计输入字符串中的不同类型字符数量,这涉及到字符串处理和条件判断。通过使用循环结构和字符类别判断,可以高效地完成统计任务。 ### 数字序列求和 **程序4** 中,求解特定形式的数字序列的和,...
递归方法通常是选择一个元素固定,然后递归地生成剩余元素的所有排列,最后再移动固定元素的位置重复此过程。非递归方法则往往涉及循环和交换元素的操作,例如著名的Johnson-Trotter算法或Steinhaus-Johnson-Trotter...
我们可以创建一个函数,接受剩余未使用的数字集合和当前构建的数字字符串作为参数,每次递归调用时选择一个未使用过的数字添加到结果字符串,然后将剩下的数字集合和更新后的字符串传递给下一次调用。这种方法更灵活...
2. 编辑Python程序的软件:IPython是一个增强交互式Python shell,Jupyter Notebook则是一个支持多种语言的交互式计算环境,它们都可以编辑Python程序。而Scratch标准版是一个面向儿童的图形化编程工具,不适合编辑...