LeetCode(剑指 Offer)- 38. 字符串的排列
Posted 放羊的牧码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode(剑指 Offer)- 38. 字符串的排列相关的知识,希望对你有一定的参考价值。
题目链接:点击打开链接
题目大意:略
解题思路:略
相关企业
- 字节跳动
- 亚马逊(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. 给表达式添加运算符