注意不能重复
字符串的排列
http://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7
字符串的全排列
题解
可以将字符串分为两个部分,第一个字符和剩下其他的字符,先确定第一个字符的所有可能结果,即先与自身交换再剩下的其他字符逐一交换,每交换完一次就相当于确定了一个字符,接着需要确定下一个字符即第二个字符,让它再与自身交换然后与它之后的字符逐一交换……
代码
import java.util.ArrayList;
import java.util.TreeSet;
public class Solution {
public ArrayList<String> strList = new ArrayList<>();
public TreeSet<String> treeList = new TreeSet<>();
public ArrayList<String> Permutation(String str) {
if (str == null || str.length() <= 0)
return strList;
Permutation(str.toCharArray(), 0);
for (String s : treeList)
strList.add(s);
return strList;
}
public void Permutation (char[] str, int index) {
int length = str.length;
if (index == length - 1)
treeList.add(String.valueOf(str));
else {
for (int i = index; i < length; ++i) {
swap(str, index, i);
Permutation(str, index + 1);
swap(str, index, i);
}
}
}
public void swap(char[] str, int a, int b) {
char temp = str[a];
str[a] = str[b];
str[b] = temp;
}
}拓展:字符串的全组合
题解
代码
package com.ittyx;
import java.util.ArrayList;
public class ExtraCombination28ver02 {
public static int[] A = {1, 2, 3, 4};
public static void main(String[] args) {
for (int i = 1; i <= A.length; i++) {
ArrayList<Integer> result = new ArrayList<>();
getCombination(i, 0, result);
}
}
public static void getCombination(int m, int start, ArrayList<Integer> result) {
if (m == 0) {
//m个元素已经找齐,则打印
for (Integer i : result) {
System.out.print(i + " ");
}
System.out.println();
return;
}
if (start < A.length) {
result.add(A[start]);
//使用A[start[,从剩下的(n-start+1)个元素中找m - 1个元素求它的组合
getCombination(m - 1, start + 1, result);
//不使用A[start],从剩下(n-start+1)个元素中找m个元字符,求它的组合
result.remove(result.size() - 1);//删掉本次添加的元素
getCombination(m, start + 1, result);
}
}
}
查看16道真题和解析
