• JZ38 字符串的排列


    描述

    输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组

    例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。

    数据范围:n < 10n<10
    要求:空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!)

    输入描述:

    输入一个字符串,长度不超过10,字符只包括大小写字母。

    示例1

    输入:

    "ab"

    复制返回值:

    ["ab","ba"]

    复制说明:

    返回["ba","ab"]也是正确的         

    示例2

    输入:

    "aab"

    复制返回值:

    ["aab","aba","baa"]

    复制

    示例3

    输入:

    "abc"

    复制返回值:

    ["abc","acb","bac","bca","cab","cba"]

    复制

    示例4

    输入:

    ""

    复制返回值:

    []

    复制

    1. import java.util.*;
    2. import static java.lang.Math.*;
    3. public class Solution {
    4. /**
    5. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    6. *
    7. *
    8. * @param str string字符串
    9. * @return string字符串ArrayList
    10. */
    11. public String swap(String str,int index,int i){
    12. // System.out.println(str);
    13. char[] x= str.toCharArray();
    14. char temp=x[index];
    15. x[index]=x[i];
    16. x[i]=temp;
    17. str=String.valueOf(x);
    18. // System.out.println(str);
    19. return str;
    20. }
    21. public void dfs(int index,String str,ArrayList<String> ans){
    22. if(index==str.length()-1)ans.add(str);
    23. for(int i=index;i<str.length();i++){
    24. str=swap(str,index,i);
    25. dfs(index+1,str,ans);
    26. str=swap(str,i,index);
    27. }
    28. }
    29. public ArrayList<String> Permutation (String str) {
    30. // write code here
    31. //
    32. ArrayList<String> ans=new ArrayList<String>();
    33. dfs(0,str,ans);
    34. HashSet<String> hashset=new HashSet<String>();
    35. for(String x:ans){
    36. // System.out.println(x);
    37. hashset.add(x);
    38. }
    39. ans.clear();
    40. for(String x:hashset){
    41. // System.out.println(x);
    42. ans.add(x);
    43. }
    44. return ans;
    45. }}

    知识点回顾:

    1.java的函数参数都是传值的,但是string类型也是放入堆栈的,其他的对象都是传值放入的引用。

    2 .arraylist的函数的clear()是消除所有元素

    3. string的length()函数查看长度,

    4.str.toCharArray()转变为char【】方便操作

    5. String.valueOf()把char【】变为string

    思路:

    这里我们使用dfs来遍历所有的可能性

    对于该算法的正确性我们从两个方面看:

    数量上:每次dfs都是从索引到最后,一共也是n的阶乘个结果

    互异性:假设两个不一样的path导致一样的str,是不可能的,因为每一个char在之后都不可能再对他进行改变,每次都是char《--》char+1,char+2,char+3.....size   接着就是char+1开头了,这样的话不可能再后面的时候又把char位置的字符变为和另一个一样的,所以他们不一样,而一共就只有n的阶乘个不一样的,所以结论正确。

    最终需要去重!;

  • 相关阅读:
    Springcloud之OAuth2
    mysql通过开启全局日志进行定位排查慢sql
    第30届深圳礼品展暨1688工厂直采季开幕,携手创增长
    vue单页面应用使用 history模式路由时刷新页面404的一种可能性
    Stable Diffusion WebUI 使用 VAE 增加滤镜效果
    小景的Dba之路--Oracle用exp导出dmp文件很慢
    使用HTML实现一个静态页面(含源码)
    BFS - 常见算法问题
    微服务(五)——服务注册与发现:Zookeeper&Consul
    Ubuntu20.4系统隐藏顶栏
  • 原文地址:https://blog.csdn.net/chenziang1/article/details/126835901