字符串的排列 的迭代解法
来源:互联网 发布:中国金融大数据 编辑:程序博客网 时间:2024/06/04 17:41
微软等数据结构+算法面试100题 中第53题
53.字符串的排列。
题目:输入一个字符串,打印出该字符串中字符的所有排列。
例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串
abc、acb、bac、bca、cab和cba。
分析:这是一道很好的考查对递归理解的编程题,
因此在过去一年中频繁出现在各大公司的面试、笔试题中。
分析:这是一道很好的考查对递归理解的编程题,
因此在过去一年中频繁出现在各大公司的面试、笔试题中。
我们以三个字符abc 为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求
33
后面两个字符bc 的排列。当两个字符bc 的排列求好之后,我们把第一个字符a 和后面的b
交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac 的排列。现在是把c 放到
第一位置的时候了。记住前面我们已经把原先的第一个字符a 和后面的b 做了交换,为了保
证这次c 仍然是和原先处在第一位置的a 交换,我们在拿c 和第一个字符交换之前,先要把
b 和a 交换回来。在交换b 和a 之后,再拿c 和处在第一位置的a 进行交换,得到cba。我
们再次固定第一个字符c,求后面两个字符b、a 的排列。
既然我们已经知道怎么求三个字符的排列,那么固定第一个字符之后求后面两个字符的排
列,就是典型的递归思路了。
void leftrorate(char *p, int n)
{
char t = *p;
for(int i=1;i<n;i++)
p[i-1] = p[i];
p[n-1] = t;
}
//递归解法
void permuation(char *str, int n, int m)
{
if(m==n-1)
{
printf("%s/n", str);
return;
}
for(int i=m;i<n;i++)
{
permuation(str, n, m+1);
leftrorate(str+m, n-m);
}
}
//迭代解法
void permuation(char *str, int n)
{
int i = 0; //转的圈数
int k = 0; //栈的深度
std::stack<int> st;
while(i<n || k>0)
{
if(k<n-1 && i<n-k+1)
{
//当k<n-1 && 转的不够一圈
st.push(i);
k++;
i=0;
}
else
{
if(k==n-1)
{//长度但到字符串长
printf("%s/n", str);
leftrorate(str+k-1, n-k+1);
if(k>0)
{
++st.top();
}
}
if(st.top()==n-k+1)
{//转的够一圈
while(st.top()==n-k+1)
{
st.pop();
k--;
if(k>0)
{
++st.top();
}
else
return;
leftrorate(str+k-1, n-k+1);
}
i=0;
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char str[5] = "abcd";
permuation(str, 4);
//char str[4] = "abc";
//permuation(str, 3);
return 0;
}
- 字符串的排列 的迭代解法
- 线性方程组的迭代解法
- 全排列的解法
- 汉若塔问题的迭代解法
- 全排列生成的迭代算法
- 全排列的递归解法
- 全排列的递归解法
- 机试准备 进出栈的迭代 解法
- [转载]二叉树逆序遍历的迭代解法
- 二叉树三种遍历的递归和迭代解法
- 链表翻转的迭代和递归解法
- 线性方程组的迭代解法:高斯-塞德尔迭代法
- 线性方程组的迭代解法:雅可比迭代法
- 线性方程组的迭代解法:超松弛迭代法
- 工程计算5——线性方程组的迭代解法
- 90,78. Subsets II I 典型的回溯算法,另 迭代解法和 位解法
- 翻转字符串的解法
- 一个全排列的解法[原创]
- poj2356——Find a multiple
- Jquery常用
- 网页制作基础:如何去掉超链接的下划线(转自:http://homepage.yesky.com/346/2551346.shtml)
- pe_xscan作了3点更新
- SUSE 11.2 设置宽屏 1440x900 分辨率
- 字符串的排列 的迭代解法
- 体验OpenMP并行开发
- 子网掩码之简述 与 IP使用中的CIDR无类别编址
- 小提示:Portlet的显示名字设定
- UML中类之间的关系
- C++类的设计~
- Paxos Made Simple [原文解释版][转载]
- 信道化E1与非信道化E1区别
- Linux高级进程间通信:信号量