排列组合问题的C++代码
来源:互联网 发布:淘宝账户被冻结怎么办 编辑:程序博客网 时间:2024/06/05 13:26
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
vector<char> s_unused;
vector<char> s_used;
map<string, int>m;
for(int i = 0; i<str.length(); i++)
{
s_unused.push_back(str[i]);
}
combine(s_unused, s_used, m);
vector<string> rtn;
for(map<string, int>::iterator it = m.begin(); it != m.end(); it++)
{
rtn.push_back(it->first);
}
return rtn;
}
//实现组合排列
void combine(vector<char> s_unused, vector<char> s_used, map<string, int> &m)
{
if(s_unused.empty())
{
string s;
for(vector<char>::iterator it = s_used.begin(); it != s_used.end(); it++)
{
s += *it;
}
m[s] = 1;
return;
}
for(vector<char>::iterator it = s_unused.begin(); it != s_unused.end(); it++)
{
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这本质上是个排列组合问题。只是加了去除重复的情况。
如果假如输入没有重复,则可以建立两个集合set,一个集合存放尚未排列过的元素,一个集合存放已经排列过的元素。然后依次将未排列的集合中的元素移入已排列集合中。递归实现移入的过程。
如果输入中有重复元素,则不能用集合set装元素,因为set自动去除重复元素。所以可以用vector装元素。
以下是具体实现代码:
vector<string> Permutation(string str) {
vector<char> s_unused;
vector<char> s_used;
map<string, int>m;
for(int i = 0; i<str.length(); i++)
{
s_unused.push_back(str[i]);
}
combine(s_unused, s_used, m);
vector<string> rtn;
for(map<string, int>::iterator it = m.begin(); it != m.end(); it++)
{
rtn.push_back(it->first);
}
return rtn;
}
//实现组合排列
void combine(vector<char> s_unused, vector<char> s_used, map<string, int> &m)
{
if(s_unused.empty())
{
string s;
for(vector<char>::iterator it = s_used.begin(); it != s_used.end(); it++)
{
s += *it;
}
m[s] = 1;
return;
}
for(vector<char>::iterator it = s_unused.begin(); it != s_unused.end(); it++)
{
//依次将未排列的元素移入已排列的容器中
char tmp = *it;
s_used.push_back(tmp);
s_unused.erase(it);
combine(s_unused, s_used, m);
s_unused.insert(it, tmp);
s_used.pop_back();
}
}
char tmp = *it;
s_used.push_back(tmp);
s_unused.erase(it);
combine(s_unused, s_used, m);
s_unused.insert(it, tmp);
s_used.pop_back();
}
}
0 0
- 排列组合问题的C++代码
- C++:数组排列组合的问题。
- 排列组合的代码分析
- c/c++算法 排列组合问题
- 一个排列组合的问题
- 字符串的排列组合问题
- 字符串的排列组合问题
- 字符串的排列组合问题
- 字符串的排列组合问题
- 小球的排列组合问题
- 字符串的排列组合问题
- 字符串的排列组合问题
- 字符串的排列组合问题
- 字符串的排列组合问题
- 字符串的排列组合问题
- 常见的排列组合问题
- 排列组合算法的实现代码
- C语言排列组合的实现
- 斯坦福机器学习网易公开课笔记8
- Spring-MVC中ModelAndView对象所添加的内容在前端用EL表达式获取不到的问题
- Android 框架之EventBus(一)
- 跨境电商:阿根廷本地支付Pago Fácil
- 三四十岁以上的老程序猿都去哪了?
- 排列组合问题的C++代码
- JDK环境配置-Ubuntu
- 架构之路之spring集成redis缓存
- 轻量级中间件MySQL Router介绍与性能测试
- CodeMirror事件和常用方法
- StringUtils的 isBlank与isEmpty区别?
- AndroidManifest.xml配置文件详解
- [Multi-SG] POJ 3537 Crosses and Crosses & BZOJ 2940 [Poi2000]条纹
- ConcurrentLinkedDeque