面试题 08.08. 有重复字符串的排列组合
Posted ocpc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题 08.08. 有重复字符串的排列组合相关的知识,希望对你有一定的参考价值。
题目:
解答:
在无重复字符代码的基础上先对字符串进行排序,这样重复字符必然相邻,然后在回溯过程中加一句判断条件去除重复排列。
1 class Solution 2 { 3 public: 4 vector<string> permutation(string S) 5 { 6 vector<string> res; 7 sort(S.begin(), S.end()); //先排列,使得重复字符相邻,便于后面去重 8 backTrack(res, S, 0); 9 return res; 10 } 11 12 void backTrack(vector<string> &res, string S, int begin) 13 { 14 if (begin == S.size()) 15 { 16 res.push_back(S); 17 } 18 for (int i = begin; i < S.size(); ++i) 19 { 20 /*因为首次交换是i == begin,S[i]与自身交换 21 因此考虑两种重复情况的去除 22 1.S[i] == S[i-1] 23 2.S[i] == S[begin]*/ 24 if (i > begin && (S[i] == S[i - 1] || S[i] == S[begin])) 25 { 26 continue; 27 } 28 else 29 { 30 swap(S[begin], S[i]); 31 backTrack(res, S, begin + 1); //DFS 32 swap(S[begin], S[i]); 33 } 34 } 35 } 36 };
以上是关于面试题 08.08. 有重复字符串的排列组合的主要内容,如果未能解决你的问题,请参考以下文章
《程序员面试金典(第6版)》面试题 08.08. 有重复字符串的排列组合(回溯算法,全排列问题)C++
算法面试题 08.07. 无重复字符串的排列组合(多语言实现)