ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

leetcode 面试题08.08 有重复字符串的排列组合 C/C++ 排序 + 深度优先搜索(分支限界)

2022-09-04 01:31:37  阅读:203  来源: 互联网

标签:sort 面试题 used cur retVec 08.08 vector posVec 限界


#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
class Solution {
public:
vector<string> permutation(string S) {
sort(S.begin(),S.end());
vector<string> retVec;
vector<int> used_posVec(S.size());
string cur_S;
recursive(retVec,S,cur_S,1,used_posVec);
return retVec;
}
/** 采用深度优先搜索 + 分支限界的方式****/
void recursive(vector<string> &retVec, string &sort_S,string &cur_S,int cur_index,vector<int> &used_posVec){
if(cur_index == sort_S.size()) //递归叶子节点,递归终止
{
//查看当前还有哪个字符没有被使用
for(int i = 0;i < used_posVec.size();i++)
if(!used_posVec[i]) {
cur_S.push_back(sort_S.at(i));
retVec.push_back(cur_S); //诞生一种新的情况
cur_S.pop_back();
}
}else{
char last_try_char = 0; // 上一个被当前位置使用的字符是什么
for(int i = 0;i < used_posVec.size();i++){
cur_S.push_back(sort_S.at(i));
if(!used_posVec[i] && last_try_char != sort_S.at(i)) // 该字符在这个位置没有被使用,并且不等于上一个在该位置尝试过的字符
{
used_posVec[i] = 1;
recursive(retVec,sort_S,cur_S,cur_index+1,used_posVec);
used_posVec[i] = 0;
last_try_char = sort_S.at(i);
}
cur_S.pop_back();
}
}
}
};
int main(){
Solution s;
vector<string> retVec = s.permutation("abccc");
for(auto it = retVec.begin();it!=retVec.end();it++){
cout<<*it<<endl;
}
return 1;
}

标签:sort,面试题,used,cur,retVec,08.08,vector,posVec,限界
来源: https://www.cnblogs.com/daniel123/p/16654128.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有