LeetCode(剑指 Offer)- 38. 字符串的排列

Posted 放羊的牧码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode(剑指 Offer)- 38. 字符串的排列相关的知识,希望对你有一定的参考价值。

题目链接:点击打开链接

题目大意:

解题思路:

相关企业

  • 字节跳动
  • Facebook
  • 亚马逊(Amazon)

AC 代码

  • Java
// 解决方案(1)
class Solution 

    Set<String> sets = new HashSet<>();

    String str;

    public String[] permutation(String s) 
        str = s;
        dfs(0);
        String[] res = new String[sets.size()];
        return sets.toArray(res);
    

    boolean[] filter = new boolean[9];

    char[] arr = new char[8];

    void dfs(int p) 
        if (p == str.length()) 
            sets.add(new String(arr, 0, str.length()));
        
        for (int i = 0; i < str.length(); i++) 
            if (filter[i]) 
                continue;
            
            filter[i] = true;
            arr[p] = str.charAt(i);
            dfs(p + 1);
            filter[i] = false;
        
    


// 解决方案(2)
class Solution 
    List<String> res = new LinkedList<>();
    char[] c;
    public String[] permutation(String s) 
        c = s.toCharArray();
        dfs(0);
        return res.toArray(new String[res.size()]);
    
    void dfs(int x) 
        if(x == c.length - 1) 
            res.add(String.valueOf(c));      // 添加排列方案
            return;
        
        HashSet<Character> set = new HashSet<>();
        for(int i = x; i < c.length; i++) 
            if(set.contains(c[i])) continue; // 重复,因此剪枝
            set.add(c[i]);
            swap(i, x);                      // 交换,将 c[i] 固定在第 x 位
            dfs(x + 1);                      // 开启固定第 x + 1 位字符
            swap(i, x);                      // 恢复交换
        
    
    void swap(int a, int b) 
        char tmp = c[a];
        c[a] = c[b];
        c[b] = tmp;
    
  • C++
class Solution 
public:
    vector<string> permutation(string s) 
        dfs(s, 0);
        return res;
    
private:
    vector<string> res;
    void dfs(string s, int x) 
        if(x == s.size() - 1) 
            res.push_back(s);                       // 添加排列方案
            return;
        
        set<int> st;
        for(int i = x; i < s.size(); i++) 
            if(st.find(s[i]) != st.end()) continue; // 重复,因此剪枝
            st.insert(s[i]);
            swap(s[i], s[x]);                       // 交换,将 s[i] 固定在第 x 位
            dfs(s, x + 1);                          // 开启固定第 x + 1 位字符
            swap(s[i], s[x]);                       // 恢复交换
        
    
;

以上是关于LeetCode(剑指 Offer)- 38. 字符串的排列的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 字符串的排列全排列问题(剑指offer38)

LeetCode(剑指 Offer)- 38. 字符串的排列

LeetCode 剑指 Offer 38. 字符串的排列 / 31. 下一个排列 / 第 246 场周赛

LeetCode 剑指Offer 38[回溯 递归] 字符串的排列 HERODING的LeetCode之路

LeetCode1269. 停在原地的方案数 / 剑指 Offer 38. 字符串的排列 / 216. 组合总和 III / 剑指 Offer 39. 数组中出现次数超过一半的数字/229. 求众数(

LeetCode 剑指 Offer II 069. 山峰数组的顶部(三分) / 38. 外观数列 / 282. 给表达式添加运算符