剑指 Offer 38. 字符串的排列

导读:本篇文章讲解 剑指 Offer 38. 字符串的排列,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com



题目

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

在这里插入图片描述

思考

  • 1、注意要去重
  • 2、排列组合=》回溯
  • 3、使用一个数组来完成去重

代码和注释

/**
    全排列
    =》回溯
 */
class Solution {
    // 结果集
    List<String> res = new ArrayList<>();

    String[] result = null;

    public String[] permutation(String s) {
        String str="";
        // 用于记录这个值是不是这个值是不是使用过了
        int[] used = new int[s.length()];
        // 排序
        char[] chars = s.toCharArray();
        Arrays.sort(chars);
        s = new String(chars);

        backtacking(s, str, used);
        return result;
    }


    public void backtacking(String s, String str, int[] used){
        if(str.length() == s.length()){
            // 收集结果
            res.add(str);
            return;
        }

        for(int i = 0; i < s.length(); i++){
            // 每个节点用过的就不使用了,仅试用于没有重复的值
            // if(str.contains(s.charAt(i)+"")){
            //     continue;
            // }
            if(i>0 && s.charAt(i)==s.charAt(i - 1) && used[i - 1] == 1 ){
                continue;
            }
            if(used[i] == 0){
                used[i] = 1;
                str = str + s.charAt(i);
                backtacking(s,str,used);
                str = str.substring(0, str.length()-1); 
                used[i] = 0;
            }
            
        }
        // 集合转数组
        result = res.toArray(new String[0]);

        // 超时转
        // result = new String[res.size()];

        // for(int i = 0; i< res.size(); i++){
        //     result[i] = res.get(i);
        // }
    }
}

总结

  • 1、对used的作用,用过就不在用来。这是全排列,所以我们要判断

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96122.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!