public class MyTestGameCore {
public static void listAll(char[] arr_Str) {
if (arr_Str.length <= 1) {
System.out.println(arr_Str[0]);
return;
}
doPerm(0 + 1, arr_Str, new char[] { arr_Str[0] });
}
/*
* index:当前要进行挨个插位的字符下标 arr_All:给定的字符数组 arr_Already:当前索引前已排好的字符数组
*/
private static void doPerm(int index, char[] arr_All, char[] arr_Already) {
if (index == arr_All.length - 1) {
for (int i = index; i >= 0; i--) {
System.out.println(new String(insertAt(arr_Already, i,
arr_All[index])));
}
} else {
for (int i = index; i >= 0; i--) {
doPerm(index + 1, arr_All, insertAt(arr_Already, i,
arr_All[index]));
}
}
}
// 指定位置插入新的字符,并将原数组中的元素往后移动
private static char[] insertAt(char[] char_Arr, int index, char c) {
char[] tmp = new char[char_Arr.length + 1];
for (int i = 0, j = 0; i < tmp.length; i++, j++) {
if (i == index) {
tmp[index] = c;
j--;
} else {
tmp[i] = char_Arr[j];
}
}
return tmp;
}
public static void main(String[] args) throws IOException {
System.out.println("Please input a String!");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
char[] arr_Str = str.toCharArray();
listAll(arr_Str);
}
}
通过改变字符的插入位置,使用递归来实现全排列.
下面的代码是采用Set实现的全排列去重,原理与上面一样:
public static Set<String> list(String str) {
char[] array_all = str.toCharArray();
if (array_all.length == 1) {
System.out.println(array_all[0]);
return null;
}
Set<String> set = new HashSet<String>();
set = go(array_all, new char[] { array_all[0] }, 1);
return set;
}
public static Set<String> go(char[] all, char[] already, int index) {
Set<String> set = new HashSet<String>();
if (index == all.length - 1) {
for (int i = index; i >= 0; i--) {
set.add(new String(insertINDEX(already,all[index],i)));
}
} else {
for(int i = index; i >= 0; i--){
set.addAll(go(all,insertINDEX(already,all[index],i),index+1));
}
}
return set;
}
public static char[] insertINDEX(char[] already, char a, int index) {
char[] temp = new char[already.length + 1];
for (int i = 0 ,j= 0; i < temp.length;j++, i++) {
if (i == index) {
temp[i] = a;
j = j - 1;
} else {
temp[i] = already[j];
}
}
return temp;
}
public static void main(String [] args) throws IOException{
System.out.println("Input A String!");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
Set<String> set = new HashSet<String>();
set = list(str);
Iterator it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
分享到:
相关推荐
下面我们将深入探讨如何使用Java实现字符数组的全排列。 首先,我们需要了解回溯法。回溯法是一种试探性的解决问题方法,它尝试逐步找到问题的所有解。当发现某一步无法继续找到有效解时,会退回一步,尝试其他的...
- `TestPermute.java`:可能实现了字符串的全排列算法,并命名为`permute`方法。 - `Test2.java`:可能是对另一种算法的实现,比如改进或优化过的版本。 - `Test.java`:通常用于编写单元测试,检验各种输入情况下,...
"java实现字符串的全排列" java实现字符串的全排列是指通过编程语言java来生成一个字符串的所有可能排列。例如输入字符串abc,则输出所有可能的排列组合:abc,acb,bac,bca,cab和cba。 在java中,实现字符串的...
简单的实现,代码很短。...输入一个字符串,输出它的字符的所有组合的情况 如输入“abc”,则输出abc,acb,bac,bca,cab,cba。 但如果输入“aba”,即有重复的,也会输出aba,aab,baa,baa,aba,aab。
在编程领域,全排列是一个经典的算法问题,它涉及到数组或字符串的所有可能的顺序组合。当给定一个包含N个不同元素的集合时,全排列就是要列出所有可能的N!(N的阶乘)种排列方式。在这个场景中,我们将探讨如何使用...
1. 字符串全排列: 在提供的代码中,可以看到两种实现字符串全排列的方法。它们都是通过递归的方式来生成所有可能的字符组合。核心逻辑是遍历基础字符串(base),在每次迭代中删除一个字符,并将这个字符添加到...
- 接下来,程序读取`input.txt`文件中的数据,对字符串进行全排列操作,并将结果输出。 2. **全排列函数`perm()`**: - 这个函数接受三个参数:一个字符数组`list[]`,以及两个整数`k`和`m`。`k`代表当前处理的...
此题不仅考验对字符串及字符数组的操作熟练度,还加深了对Java中字符串处理函数应用的理解。 通过深入解析这些精选题目,学习者不仅能够掌握Java递归、字符串操作、字符数组运用等核心技能,还能熟悉面向对象编程的
3. **全排列问题**:对于字符串数组的全排列,可以采用回溯算法或者动态规划来解决,涉及到数组操作和递归。 4. **JavaScript编程**:在浏览器中显示当前星期,可以用JavaScript的Date对象获取日期,然后处理输出。...
在Java编程中,有时我们需要处理字符串的大小写组合问题,特别是在进行全排列或者组合搜索时。这个场景描述的代码示例就是解决此类问题的一个实例。...理解并掌握这种技巧可以帮助开发者解决涉及字符串全排列的问题。
根据提供的文件信息,可以...这些知识点涉及编程基础、数据结构、算法设计、字符串处理以及日期时间处理等多方面内容,对于从事Java后端开发的人员来说,掌握这些知识点对于提升编程能力、解决实际问题有着重要的意义。
字典排序,也称为字典序,是一种特殊的排序方式,特别是在字符串中应用广泛。它将字符串按照字典的顺序排列,即按照字符的Unicode值进行升序排序。在处理全排列问题时,字典排序可以帮助我们系统地生成所有可能的...
字符串操作在编程中相当普遍,尤其是在需要动态构建字符串或进行大量字符串操作时,使用`StringBuffer`比使用普通的字符串连接(如`+`)要高效得多。 6. 设计模式的应用 虽然代码片段中没有直接提到设计模式,但是...
通过这两个问题,我们可以学习到Java中的递归算法、字符串处理、字符数组的操作、以及面向对象编程的基本概念。对于准备蓝桥杯或其他编程竞赛的学生来说,掌握这些基础知识至关重要。同时,通过实践这些真题,可以...
该题考察了字符串处理的基本技巧,涉及到字符串的分割、大小写转换以及特殊字符的插入等操作。 **知识点解析**: 1. **需求分析**:题目要求对输入的字符串进行以下处理: - 将每个单词的首字母转换成大写。 - ...
#### 二、字符串全排列问题 全排列问题是指给定一个字符串,求出该字符串的所有可能的排列组合。例如,对于字符串 "abc",其所有可能的排列为 "abc"、"acb"、"bac"、"bca"、"cab" 和 "cba"。 **代码分析:** ```...
4. 字符串处理:内容中有关于字符串去重的逻辑,如`removeDuplicate`方法的定义,以及字符串到字符集合的转换方法`convert`。 5. 循环和条件控制语句:通过for循环和if条件语句进行逻辑判断和重复执行代码块,如`...
### 蓝桥杯Java历年真题解析及答案整理 #### 题目一:全排列问题 ...这些题目涵盖了基本的数据结构操作、递归算法应用以及字符串处理等重要内容,对于提高参赛者的编程能力和解决问题的能力非常有帮助。
2. **字符串工具**:可能有处理字符串的类,如格式化输出、字符串分割、去除空白字符、替换子串等功能。 3. **日期时间**:可能包含处理日期和时间的工具类,如时间格式化、日期比较、时间差计算等。 4. **IO操作**...
### 蓝桥杯大题总结之Java版详解 #### 一、全排列问题解析 ...以上两个问题展示了在Java编程中处理全排列以及字符串操作的一些常见技巧和方法。这些练习有助于加深对递归、字符串处理、正则表达式的理解和应用。