C/C++中char* 与char []定义的区别
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]);
}
}
}
C/C++中char* 与char []定义的区别的更多相关文章
- PHP中变量声明和定义的区别
先记录一下(不知道PHP是不是一样,但是C语言是这样的):把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”.声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用 ...
- C++中struct和class定义类区别
有一种常见的误解认为用struct保留字定义的类与用class定义的类有很大的区别.唯一的不同只是默认的成员保护级别和默认的派生保护级别,没有其他的区别. 1. 用class定义的类,默认的成员访问级 ...
- 网站统计中的PV-UV-IP的定义与区别
--------首先来看看ip.uv和pv的定义---------- PV(访问量):即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次.UV(独立访客):即Unique Visi ...
- C++之声明与定义的区别
直接举例,在C++中,声明与定义的区别如下: extern int a;//若有extern关键字,则只是声明 int b;//若没有extern关键字,则为声明+定义 int a;//若之前已经声明 ...
- 在数据库中varchar与char的区别
char是固定长度类型 varchar是可变的长度类型 char和varchar类型相似,但是它们的存储和检索方式不同.在MySQL5.0.3,它们在最大长度和是否保留尾部空格也不相同. char和v ...
- C++ 中 int,char*,string,CString之间相互转换-整理
<多字符集下> #include <string> //使用C++标准库的string类时, 定义时 std::string str; using namespace std; ...
- 用c++语言编写函数 int index(char *s,char * t),返回字符串t在字符串s中出现的最左边的位置,如果s中没有与t匹配的子串,则返回-1。类似于索引的功能。
首先,分析一下程序的思路: 1:从s的第i个元素开始,与t中的第1个元素匹配,如果相等,则将s的第i+1元素与t中的第2个元素匹配,以此类推,如果t所有元素都匹配,则返回位置i;否则,执行2; 2: ...
- VC中BSTR、Char和CString类型的转换
1.char*转换成CString 若将char*转换成CString,除了直接赋值外,还可使用CString::format进行.例如: char chArray[] = "This is ...
- MySQL中varchar与char区别
MySQL中varchar与char区别(转) MySQL中varchar最大长度是多少? 一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字 ...
随机推荐
- 开源框架ViewPagerIndicator的使用——TabPageIndicator
1.导入Android-ViewPagerIndicator库文件 下载地址:https://github.com/JakeWharton/ViewPagerIndicator 2.布局文件 ...
- MSSQL奇技淫巧
MSSQL:获得库每个表的记录数和容量 sp_msforeachtable是MS未公开的存储过程: exec sp_msforeachtable @command1="print '?'&q ...
- 常见的transformation 和 Action
常见transformation map 将RDD中的每个元素传入自定义函数,获取一个新的元素,然后用新的元素组成新的RDD filter 对RDD中每个元素进行判断,如果返回true则保留,返回fa ...
- BZOJ 3477: [Usaco2014 Mar]Sabotage( 二分答案 )
先二分答案m, 然后对于原序列 A[i] = A[i] - m, 然后O(n)找最大连续子序列和, 那么此时序列由 L + mx + R组成. L + mx + R = sum - n * m, s ...
- 利用ant的javac任务来编译程序使用ant的java任务来运行程序
<?xml version="1.0" encoding="UTF-8"?> <project name="javaTest&quo ...
- 从 Qt 的 delete 说开来
原地址:http://blog.csdn.net/dbzhang800/article/details/6300025 在C++中学习过程中,我们都知道: delete 和 new 必须 配对使用(一 ...
- linux服务之NFS和SAMBA服务
这几种网络文件传输最适合局域网.网络中用FTP 一:NFS服务 nfs(network file system)网络文件系统,改服务依赖于rpcbind服务.client通过rpc訪问server端的 ...
- POJ 3090 Visible Lattice Points 欧拉函数
链接:http://poj.org/problem?id=3090 题意:在坐标系中,从横纵坐标 0 ≤ x, y ≤ N中的点中选择点,而且这些点与(0,0)的连点不经过其它的点. 思路:显而易见, ...
- Android应用开发经常使用知识
在其它站点看到的,Mark一下 1.近期打开的应用不在近期任务列表中显示 android:excludeFromRecents="true" 设置为true,则排除在近期任务列表之 ...
- Google C++ style guide——命名约定
1.通过命名规则 函数命名.变量命名.文件命名应具有描写叙述性. 类型和变量应该是名词,函数名能够用"命令性"动词. 2.文件命名 文件名称所有小写,能够包括下划线(_)或者断线( ...