2021/2/14 剑指 Offer 38. 字符串的排列

题目描述

输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例

输入

s = "abc"

返回值

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

解题思路

  1. 使用回溯法,逐层固定一个字母。
    回溯法
  2. 可以用 Set 进行剪枝,去掉重复元素。规则是同一层内出现了一样的元素,则跳过。
    图片说明

Java代码实现

class Solution {
    ArrayList<String> list = new ArrayList<String>();
    char[] c;
    public String[] permutation(String s) {
        c = s.toCharArray();
        func(0);
        return list.toArray(new String[list.size()]);
    }

    public void func(int index) {
        if (index == c.length - 1) list.add(String.valueOf(c));
        HashSet<Character> set = new HashSet<Character>();
        for (int i = index; i < c.length; ++i) {
            if (set.contains(c[i])) continue;
            set.add(c[i]);
            switchPos(i, index);
            func(index + 1);
            switchPos(i, index);
        }
    }

    public void switchPos(int a, int b) {
        char temp = c[a];
        c[a] = c[b];
        c[b] = temp;
    }
}
全部评论

相关推荐

10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务