字符串的全排列

题目:

全排列
字符串的排列
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

题解:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:

1. 代码一:

通过List 的 contains() 方法,进行去重。

import java.util.*;

public class 全排列 {

    public static ArrayList<String> Permutation(String str)
    {
        ArrayList<String> ans = new ArrayList<>();  //所有排列的可能都在这里
        if(str != null || str.length() > 0)
        {
            int n = str.length();
            char s[] = str.toCharArray();
            Arrays.sort(s); // 输入字符串如果是乱序,则需要先按照从小到大的顺序排列           
            backtrack(s, 0, n - 1, ans);
            Collections.sort(ans);
        }
        return ans;
    }

    public static void backtrack(char s[], int begin, int end, ArrayList<String> ans)
    {
        if(begin == end)
        {
            String str = String.valueOf(s);
            if(!ans.contains(str))
            {
                ans.add(str);
            }
        }
        for(int i = begin; i <= end; i++)
        {
            swap(s, i, begin);  //依次选一个数固定住
            backtrack(s, begin + 1, end, ans); //让后面的进行全排列
            swap(s, i, begin);  //恢复原来的模样,回溯关键
        }
    }

    public static void swap(char s[], int i, int j)
    {
        char temp = s[i];
        s[i] = s[j];
        s[j] = temp;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext())
        {
            String str = sc.next();
            ArrayList<String> res = Permutation(str);
            for(int i = 0; i < res.size(); i++)
            {
                System.out.println(res.get(i));
            }
            System.out.println();
        }
    }   
}

2. 代码二:

使用Set集合来进行去重。

import java.util.*;

public class 面试题38 {

    // public static ArrayList<String> Permutation(String str)
    // {
    //     ArrayList<String> ans = new ArrayList<>();  //所有排列的可能都在这里
    //     if(str != null || str.length() > 0)
    //     {
    //         int n = str.length();
    //         char s[] = str.toCharArray();
    //         Arrays.sort(s); // 输入字符串如果是乱序,则需要先按照从小到大的顺序排列
    //         backtrack(s, 0, n - 1, ans);
    //         Collections.sort(ans);
    //     }
    //     return ans;
    // }

    public static String[] permutation(String s) {
        Set<String> set = new TreeSet<>();  //所有排列的可能都在这里
        if(s != null || s.length() > 0)
        {
            int n = s.length();
            char str[] = s.toCharArray();
            Arrays.sort(str); // 输入字符串如果是乱序,则需要先按照从小到大的顺序排列
            backtrack(str, 0, n - 1, set);
        }
        String res[] = new String[set.size()];
        int i = 0;
        for(String str: set)
        {
            res[i++] = str;
        }
        return res;
    }

    public static void backtrack(char s[], int begin, int end, Set<String> set)
    {
        if(begin == end)
        {
            String str = String.valueOf(s);
            set.add(str);
        }
        for(int i = begin; i <= end; i++)
        {
            swap(s, i, begin);  //依次选一个数固定住
            backtrack(s, begin + 1, end, set); //让后面的进行全排列
            swap(s, i, begin);  //恢复原来的模样,回溯关键
        }
    }

    public static void swap(char s[], int i, int j)
    {
        char temp = s[i];
        s[i] = s[j];
        s[j] = temp;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext())
        {
            String str = sc.next();
            String res[] = permutation(str);
            for(int i = 0; i < res.length; i++)
            {
                System.out.println(res[i]);
            }
            System.out.println();
        }
    }   
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考:

  1. 算法题解:给定一个字符串输出其全排列形式的所有字符串(JAVA代码)
  2. 字符串的排列(全排列)——Java、回溯法
  3. 字符串全排列以及去重 Java 实现
  4. 字符串全排列算法
  5. July 算法习题 - 字符串4(全排列和全组合)
  6. 字符串全排列算法理解与java实现
  7. 0027算法笔记——【回溯法】回溯法与装载问题
  8. 如何实现对ArrayList排序 sort()
  9. Java - List 的 contains 方法的性能
  10. java中如何将字符串数组转换成字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dev_zyx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值