标签:字符 38 string offer int backtrack perm vis
剑指offer(38)
剑指 Offer 38. 字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
限制:
1 <= s 的长度 <= 8
利用回溯方法去解决这个问题
对于重复字符的问题,要学会排序string后去处理
class Solution {
public:
vector<string> rec;
vector<int> vis;
//回溯法
void backtrack(const string& s, int i, int n, string& perm) {
if (i == n) {
rec.push_back(perm);
return;
}
//每次遍历string s,选择未被使用过的
for (int j = 0; j < n; j++) {
//如果j这个位置选过了或者左边有重复的字符但是没选就不选(左边有重复字符,但是那个字符没选说明已经选择过了)
if (vis[j] || (j > 0 && !vis[j - 1] && s[j - 1] == s[j])) {
continue;
}
vis[j] = true;
//做出选择
perm.push_back(s[j]);
backtrack(s, i + 1, n, perm);
//撤销选择
perm.pop_back();
vis[j] = false;
}
}
vector<string> permutation(string s) {
int n = s.size();
//vis是判别数组 判断这个位置的字符是否被使用
vis.resize(n);
//排序,这样可以去处理重复字符的问题
sort(s.begin(), s.end());
string perm;
//回溯
backtrack(s, 0, n, perm);
return rec;
}
};
标签:字符,38,string,offer,int,backtrack,perm,vis 来源: https://www.cnblogs.com/BailanZ/p/16217629.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。