获取输入字符串的下一个字典序排列
2015-09-18 15:47
148 查看
如输入是ABEDGFC
则下一个字典序排列为ABEFCDG
算法流程:
1.从后往前遍历字符串str,找到第一个str[i]满足str[i]小于str[i+1],样例中,str[i]=D。此时,子序列GFC已经为字典序的最后一个排列。
2.从后往前遍历字符串str,找到第一个str[j]满足str[j]>str[i],样例中str[j]=F。
3.交换str[i]与str[j],得到ABEFGDC,并把i之后的字符串逆序,得到ABEFCDG,即为所求。
程序如下:
则下一个字典序排列为ABEFCDG
算法流程:
1.从后往前遍历字符串str,找到第一个str[i]满足str[i]小于str[i+1],样例中,str[i]=D。此时,子序列GFC已经为字典序的最后一个排列。
2.从后往前遍历字符串str,找到第一个str[j]满足str[j]>str[i],样例中str[j]=F。
3.交换str[i]与str[j],得到ABEFGDC,并把i之后的字符串逆序,得到ABEFCDG,即为所求。
程序如下:
// // FindeNext.cpp // STL // 寻找下一个字典序排列 // Created by 林和睿 on 15/9/18. // Copyright (c) 2015年 林和睿. All rights reserved. // #include <stdio.h> #include <iostream> using namespace std; char* findnext(char *current,int length){ if(current==NULL) return NULL; int i = length-2; while(current[i]>current[i+1]){//从后往前找到第一个str[i]<str[i+1] i--; if(i<0) return NULL; } char tmp; int j = length-1; for(;j>i;j--){ if(current[j]>current[i]){//从后往前找到第一个大于str[i]的str[j],交换str[i]和str[j] tmp = current[j]; current[j] = current[i]; current[i] = tmp; break; } } //把i之后的字符串倒序 j=length-1; i = i+1; while(i<j){ char tmp = current[j]; current[j] = current[i]; current[i] = tmp; i++;j--; } return current; } int main(){ string q("ABEDGFC"); char* w = const_cast<char*>(q.data()); char *p = findnext(w,7); cout<<p<<endl; }
相关文章推荐
- MySQL Join算法与调优白皮书(三)
- oracle回顾--视图、PL/SQL、游标
- Hello JSP!——内置对象基础练习题
- C#单链表的实现
- 误操作寄存器位引发的hardfault
- ctype.h 头文件
- NSMutableArray 初始化与添加删除程序
- 双set表整合出复杂的表(附有sas&n…
- 【转载】SAS Hash 对象
- 【转载】word 查找与替换中的…
- SAS--Perl Regular Expressi…
- sql合并复杂的表
- 【转载】COMPRESS 函数【功能…
- 【转载】SAS INTNX详解
- 用R软件绘制中国分省市地图
- SYSFUNC
- 【转载】format 与宏
- 口译常用成语
- 【转载】Windows下编写R pack…
- 【转载】想让你的R跟C#一样可以实…