字符串的全排列(递归方法)

字符串的全排列

   给定字符串S[0…N-1],设计算法,枚举S的全排列。

如果字符没有重复

递归算法
 以字符串1234为例:
    1 – 234
    2 – 134
    3 – 214
    4 – 231
 如何保证不遗漏: 保证递归前1234的顺序不变。

递归Code:

char str[]="1234";
int size =sizeof(str)/sizeof(char);//size为5,因为字符串最后以‘0’结尾
void Permutation(int from,int to)
{
  if(from==to)
  {
     for(int i=0;i<=to;i++)
     {
	cout<

如果字符有重复

去除重复字符的递归算法
以字符1223为例:
 1 – 223
 2 – 123
 3 – 221
带重复字符的全排列就是每个字符分别与它后面非重复出现的字符交换。
即:第i个字符与第j个字符交换时,要求[i,j)中没有与第j个字符相等的数。


IsSwap(int from,int to)是为了判断是否可以交换,如果是重复字符,就不需要交换了。

字符串的全排列(递归方法)_第1张图片


字符串的全排列(递归方法)_第2张图片

IsSwap(int from,int to)函数的时间复杂度为n,就出现了上面的n^2。所以有空间来换取时间。

利用mark[]数组,来标记重复数字是否已经使用过。

字符串的全排列(递归方法)_第3张图片

G
M
T
检测语言世界语中文简体 中文繁体丹麦语乌克兰语 乌兹别克语乌尔都语亚美尼亚语 伊博语俄语保加利亚语 僧伽罗语克罗地亚语冰岛语 加利西亚语加泰罗尼亚语匈牙利语 南非祖鲁语卡纳达语印地语 印尼巽他语印尼爪哇语印尼语 古吉拉特语哈萨克语土耳其语 塔吉克语塞尔维亚语塞索托语 威尔士语孟加拉语宿务语 尼泊尔语巴斯克语布尔语(南非荷兰语) 希伯来语希腊语德语 意大利语意第绪语拉丁语 拉脱维亚语挪威语捷克语 斯洛伐克语斯洛文尼亚语斯瓦希里语 旁遮普语日语格鲁吉亚语 毛利语法语波兰语 波斯尼亚语波斯语泰卢固语 泰米尔语泰语海地克里奥尔语 爱尔兰语爱沙尼亚语瑞典语 白俄罗斯语立陶宛语索马里语 约鲁巴语缅甸语罗马尼亚语 老挝语芬兰语苗语 英语荷兰语菲律宾语 葡萄牙语蒙古语西班牙语 豪萨语越南语阿塞拜疆语 阿尔巴尼亚语阿拉伯语韩语 马其顿语马尔加什语马拉地语 马拉雅拉姆语马来语马耳他语 高棉语齐切瓦语
世界语中文简体中文繁体 丹麦语乌克兰语乌兹别克语 乌尔都语亚美尼亚语伊博语 俄语保加利亚语僧伽罗语 克罗地亚语冰岛语加利西亚语 加泰罗尼亚语匈牙利语南非祖鲁语 卡纳达语印地语印尼巽他语 印尼爪哇语印尼语古吉拉特语 哈萨克语土耳其语塔吉克语 塞尔维亚语塞索托语威尔士语 孟加拉语宿务语尼泊尔语 巴斯克语布尔语(南非荷兰语)希伯来语 希腊语德语意大利语 意第绪语拉丁语拉脱维亚语 挪威语捷克语斯洛伐克语 斯洛文尼亚语斯瓦希里语旁遮普语 日语格鲁吉亚语毛利语 法语波兰语波斯尼亚语 波斯语泰卢固语泰米尔语 泰语海地克里奥尔语爱尔兰语 爱沙尼亚语瑞典语白俄罗斯语 立陶宛语索马里语约鲁巴语 缅甸语罗马尼亚语老挝语 芬兰语苗语英语 荷兰语菲律宾语葡萄牙语 蒙古语西班牙语豪萨语 越南语阿塞拜疆语阿尔巴尼亚语 阿拉伯语韩语马其顿语 马尔加什语马拉地语马拉雅拉姆语 马来语马耳他语高棉语 齐切瓦语
文本转语音功能仅限200个字符
选项 : 历史 : 反馈 : Donate 关闭

你可能感兴趣的:(算法,字符串)