C/C++中char* 与char []定义的区别
2024-10-11 04:45:32
Question:
给你一个字符串例如abb输出它包含的字符的所有可能排列。
例如abb输出3个:abb,bab,bba
Answer:
假设我们自己来做,那做法如下:
1. 有n个字符相当于n个格子。
2. 先放第一个格子,从n个字符中任选一个,放到这个格子即可,放完就剩下n-1个格子和n-1个字符
3. 放第二个格子,从n-1个字符中任选一个
。。。
n. 最后一个格子,只剩下一个字符,不用选,输出放好的结果
第二步到第n步其实问题本质是一样的,k个字符选一个,放到格子里即可。problem与subproblem的关系,所以我们可以用递归求解。
1. 获得字符串s,得到长度n
2. 轮询确定s[0]放哪个字符,共有n个,如果放第k个,就把s[k]放到s[0],s[0]放到s[k]
3. 放好后就求解子问题,即求s[1]~s[n-1]的排列
4. 如果已经求解到s[n-1],输出结果
Attention:传入的str应该是char数组,不能是这样定义的:char* str = "abc"; 具体为什么请参看:C/C++中char* 与char []定义的区别
//rm_dup: true for remove duplicated strings
void permutation(char* str, int start, bool rm_dup){
if(str==NULL||str=="")
return;
if(start==strlen(str)-1)
cout<<str<<endl;
bool visit[256];
memset(visit,0,sizeof(visit));
for(int i=start;i<strlen(str);i++){
if(!visit[str[i]]||!rm_dup){
visit[str[i]] = true;
std::swap(str[start],str[i]);
permutation(str,start+1,rm_dup);
std::swap(str[start],str[i]);
}
}
}
最新文章
- css 垂直居中
- UITableview中怎么找到每个cell
- 使用jQuery+PHP+Mysql实现抽奖程序
- [ActionScript 3.0] 将组件 SWC 文件导入 Flash
- ubuntu安装octave的小坑
- alpha版本冲刺总结
- Javascript+Dom(加减乘除计算器)
- 【Todo】Mybatis学习-偏理论
- Activity中与ListActivity中使用listview区别
- Android的线程和线程池
- Powerdesigner+Execel
- VS2017安装过程中【工作负载】选择安装
- vue及Eelement使用过程中遇到的一些问题
- Centos nginx安装
- centos7 安装搜狗输入法
- java 中,如何获取文件的MD5值呢?如何比较两个文件是否完全相同呢?
- 在 NHibernate 中一切必须是 Virtual 的吗?
- URL 重写
- IIS 安装问题
- hdu 4706:Children&#39;s Day(模拟题,模拟输出大写字母 N)