字典排序

字符串的排列

http://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7

本题考查的是字典排序,不是动态规划和递归。
用字典排序算法,朝着两个方向,分别找处比该序列大的最小序列和比该序列小的最大序列。
比该序列大的最小序列:设P是1~n的一个全排列:p=p1p2......pn=p1p2......pj-1pjpj+1......pk-1pkpk+1......pn。
①从排列的右端开始,找出第一个比右边数字小的数字的序号j(j从左端开始计算),即 j=max{i|pi<pi+1}。(如果不是找左边比右边小,即如果左边比右边大,那么左右交换后值变小,就不在该序列的较大侧。)
②在pj的右边的数字中,找出所有比pj大的数中最小的数字pk,即 k=max{i|pi>pj}(右边的数从右至左是递增的,因此k是所有大于pj的数字中序号最大者)。
③交换pj,pk。
④再将交换后的pj+1......pk-1pkpk+1......pn倒转得到排列p'=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,这就是排列p的下一个排列。
比该序列小的最大序列:设P是1~n的一个全排列:p=p1p2......pn=p1p2......pj-1pjpj+1......pk-1pkpk+1......pn。
①从排列的右端开始,找出第一个比右边数字大的数字的序号j(j从左端开始计算),即 j=max{i|pi>pi+1}。(如果不是找左边比右边大,即如果左边比右边小,那么左右交换后值变大,就不在该序列的较小侧。)
②在pj的右边的数字中,找出所有比pj小的数中最大的数字pk,即 k=max{i|pi<pj}(右边的数从右至左是递减的,因此k是所有小于pj的数字中序号最大者)。
③交换pj,pk。
④再将交换后的pj+1......pk-1pkpk+1......pn倒转得到排列p'=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,这就是排列p的下一个排列。
由于判题系统给出的测试序列是按照非递减的序列给出的,因此该题只需要一次找出下一个刚好较大的序列即可。

全部评论

相关推荐

牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务