字符串处理---全排列
2017-07-03 13:43
295 查看
非常抱歉昨天博主没有及时更新微博。主要原因是昨天晚上下了暴风雪,所以博主急着赶回家睡觉,就没有更新微博。这不是今天趁着开zemi之前及时更新了嘛。首先大家看了看题目就知道全排列了。全排列其实是一个挺恶心的东西。因为这个东西首先大家想到的是迭代了,但是这里的迭代有点蛋疼,因为如果我给你n个字符你就要写n个for循环。所以这里我需要和大家说的是,如果大家以后遇到这种需要写很多迭代的程序,大家一定要考虑递归。因为实际上迭代和递归是没有区别的,但是如果有的选的话大家一定要选择迭代,因为迭代需要的空间和时间花费往往更小。但是像全排列这东西还是挺恶心的,因为你需要根据字符长度选择循环次数,真心是恶心啊。
好了,接下来我给大家说一下问题描述了。比如说,这里有一个字符串abcd,大家要把它全排列输出就是:
abcd,abdc,acbd。。。。。总共4*3*2=24个字符。好了,现在上代码:
// blog_full_array.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
using namespace std;
template
void my_swap(T *a, T
*b)//这里的swap的方法其实和std::swap是一样的,但是这种方法henlow,如果大家可以的话还是使用boost::swap,它的空间和时间花费更小。
{
T temp=*a;
*a=*b;
*b=temp;
}
template//这里是真正递归的函数。这里其实和观察者模式很像,其实就是设置额外的参数去观察主要变量的变化,做出一些行动。这里就是如果迭代到最后一个字符就把他打印出来。
void _full_array(T *source, T* head, size_t length)
{
if (length==0)
{
cout<<source<<endl;//打印字符
return;
}
else
{
for(size_t tempi=0;tempi
{
my_swap(head,head+tempi);//这里的三句话其实道理还是很复杂的,我希望不懂得童鞋自己画画示意图,然后大家就会知道为什么这里要调换两次,和中间的那句迭代。
_full_array(source,head+1,length-1);
my_swap(head+tempi,head);
}
}
}
template
void full_array(T* head, size_t length)
{
T *source=head;
_full_array(source,head,length-1);
}
int main()
{
char
char_array[5]={'a','b','c','d','\0'};//这里最后一个字符是0,主要就是为了输出的时候找到字符串的结束符。
full_array(char_array,5);
return 0;
}
输出结果:
好了,接下来我给大家说一下问题描述了。比如说,这里有一个字符串abcd,大家要把它全排列输出就是:
abcd,abdc,acbd。。。。。总共4*3*2=24个字符。好了,现在上代码:
// blog_full_array.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
using namespace std;
template
void my_swap(T *a, T
*b)//这里的swap的方法其实和std::swap是一样的,但是这种方法henlow,如果大家可以的话还是使用boost::swap,它的空间和时间花费更小。
{
T temp=*a;
*a=*b;
*b=temp;
}
template//这里是真正递归的函数。这里其实和观察者模式很像,其实就是设置额外的参数去观察主要变量的变化,做出一些行动。这里就是如果迭代到最后一个字符就把他打印出来。
void _full_array(T *source, T* head, size_t length)
{
if (length==0)
{
cout<<source<<endl;//打印字符
return;
}
else
{
for(size_t tempi=0;tempi
{
my_swap(head,head+tempi);//这里的三句话其实道理还是很复杂的,我希望不懂得童鞋自己画画示意图,然后大家就会知道为什么这里要调换两次,和中间的那句迭代。
_full_array(source,head+1,length-1);
my_swap(head+tempi,head);
}
}
}
template
void full_array(T* head, size_t length)
{
T *source=head;
_full_array(source,head,length-1);
}
int main()
{
char
char_array[5]={'a','b','c','d','\0'};//这里最后一个字符是0,主要就是为了输出的时候找到字符串的结束符。
full_array(char_array,5);
return 0;
}
输出结果:
相关文章推荐
- 改进 ASP 应用程序中的字符串处理性能
- 适合于Unix与Win32下的字符串处理类,可以以此为基类进行扩展
- VB中字符串处理函数反汇编对比
- 字符串的全排列
- JAVA-字符串处理中的重点
- 几个字符串处理方法:
- clob相关的咚咚以及字符串处理
- 改进 ASP 应用程序中的字符串处理性能[转帖]
- SQL字符串日期处理.doc
- 化解字符串不能超过8000的方法及交叉表的处理
- 字段里字符串的处理问题
- 改进 ASP 应用程序中的字符串处理性能
- 几个非常有用的字符串处理函数!
- javascript字符串处理
- Strsafe.h安全的C语言字符串处理函数
- C#中处理字符串和数字
- ASP中一个字符串处理类(加强)(VBScript)
- 项目工作小结之字符串处理的几个方法
- 模拟字符串处理函数 stuff 的存储过程,对 ntext 字段进行stuff
- ASP中一个字符串处理类加强版