字符串或数组元素全排列的两种做法
前言
最近在写算法题中,遇见不少关于排列的题目,所以在此记录一下我常用的两种全排列方法。
- 借助Java中的substring方法进行递归(局限于Java且效率不高,建议看第二种方法)
public static List arrange(String s){
List list = new Vector();//用于保存全排列的结果
if(s.length() == 1){//递归的出口
list.add(s);
return list;
}
for (int i = 0; i < s.length(); i++) {
char temp = s.charAt(i);//将第i个字符取出保存
List t = arrange(s.substring(0,i)+s.substring(i+1));//然后将剩下的0到i-1和i+1到最后的字符拼接在一起,然后将这个拼接的字符串进行全排列,结果用List来保存
for (int j = 0; j < t.size(); j++) {//遍历上一步得到的全排列集合
list.add("" + temp + t.get(j));//然后将第i个字符与剩下元素全排列的结果进行拼接,并添加到list中,用于返回
}
}
return list;//将全排列结果返回
}
- 将字符数组中的某个元素取出然后与后面的元素逐个互换(通用性好且效率高)
public static void arrange(char[] chars,int k){
if(k == chars.length-1){
System.out.println(String.valueOf(chars));//将排列结果打印输出
return;
}
for (int i = k; i < chars.length; i++) {
{char temp = chars[k];chars[k] = chars[i];chars[i] = temp;}//试探(将第k个元素取出,然后依次与后面的元素进行交换)
arrange(chars,k+1);//当前k交换完毕后,进行下一个
{char temp = chars[k];chars[k] = chars[i];chars[i] = temp;}//回溯(为不影响后面元素的交换必须进行回溯)
}
}
示例程序如下
import java.util.List;
import java.util.Vector;
public class Main{
public static void main(String[] args) {
arrange("abc".toCharArray(),0);
System.out.println("-------------------------");
List list = arrange("abc");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
public static void arrange(char[] chars,int k){
if(k == chars.length-1){
System.out.println(String.valueOf(chars));//将排列结果打印输出
return;
}
for (int i = k; i < chars.length; i++) {
{char temp = chars[k];chars[k] = chars[i];chars[i] = temp;}//试探
arrange(chars,k+1);
{char temp = chars[k];chars[k] = chars[i];chars[i] = temp;}//回溯
}
}
public static List arrange(String s){
List list = new Vector();//用于保存全排列的结果
if(s.length() == 1){//递归的出口
list.add(s);
return list;
}
for (int i = 0; i < s.length(); i++) {
char temp = s.charAt(i);//将第i个字符取出保存
List t = arrange(s.substring(0,i)+s.substring(i+1));//然后将剩下的0到i-1和i+1到最后的字符拼接在一起,然后将这个拼接的字符串进行全排列,结果用List来保存
for (int j = 0; j < t.size(); j++) {//遍历上一步得到的全排列集合
list.add("" + temp + t.get(j));//然后将第i个字符与剩下元素全排列的结果进行拼接,并添加到list中,用于返回
}
}
return list;//将全排列结果返回
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步