首页 > 其他分享 >STL next_permutation与prev_permutation函数

STL next_permutation与prev_permutation函数

时间:2022-08-22 17:27:12浏览次数:92  
标签:STL 元素 next str permutation 序列 prev

刷剑指offer遇到元素排列问题 No27 字符串的排列

函数使用

题目描述:

输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。

解题思路:

看到题解中一个很奇妙的函数next_permutationprev_permutation

vector< string > Permutation(string str) {
    if (str.size() == 0)
        return vector< string >();
    vector< string > res;
    sort(str.begin(), str.end());
    do {
        res.push_back(str);
    } while (next_permutation(str.begin(), str.end()));
    return res;
}

使用手册:

std::next_permutation它用于将[first, last]范围内的元素重新排列到下一个字典上更大的排列。

即:abc下一个acb

std::prev_permutation它用于将[first, last]范围内的元素重新排列到上一个字典上更大的排列。

即:acb上一个abc

注意:next_permutation和prev_permutation必须用在已排好序的递增序列

在《STL源码解析》中找到了这个函数,在此也简单叙述一下原理:

实现原理

在STL中,除了next_permutation外,还有一个函数prev_permutation,两者都是用来计算排列组合的函数。前者是求出下一个排列组合,而后者是求出上一个排列组合。

所谓“下一个”和“上一个”,书中举了一个简单的例子:对序列 {a, b, c},每一个元素都比后面的小,按照字典序列,固定a之后,a比bc都小,c比b大,它的下一个序列即为{a, c, b},而{a, c, b}的上一个序列即为{a, b, c},同理可以推出所有的六个序列为:{a, b, c}、{a, c, b}、{b, a, c}、{b, c, a}、{c, a, b}、{c, b, a},其中{a, b, c}没有上一个元素,{c, b, a}没有下一个元素。
函数实现原理如下:
在当前序列中,从尾端往前寻找两个相邻元素,前一个记为*i,后一个记为*ii,并且满足*i < *ii。然后再从尾端寻找另一个元素*j,如果满足*i < *j,即将第i个元素与第j个元素对调,并将第ii个元素之后(包括ii)的所有元素颠倒排序,即求出下一个序列了。
prev_permutation实现类似,就是反向查找。

总结

用next_permutation和prev_permutation求排列组合很方便,但是要记得包含头文件#include <algorithm>。
虽然最后一个排列没有下一个排列,用next_permutation会返回false,但是使用了这个方法后,序列会变成字典序列的第一个,如cba变成abc。prev_permutation同理。

参考文献:

  1. https://www.iteye.com/blog/leonard1853-1450085
  2. https://interviewguide.cn/notes/03-hunting_job/03-algorithm/02-sword-offer/27-剑指offer.html

标签:STL,元素,next,str,permutation,序列,prev
From: https://www.cnblogs.com/happinesspills/p/16613412.html

相关文章

  • STL中map容器的应用(HDU1263水果题解)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1263题目描述:TimeLimit:2000MS;MemoryLimit:65536K;夏天来了~Joe经营着一个不大的水果店.他认为生存之道就......
  • springMvc35-jstl的jar包的下载
    .我们在使用spring框架的时候导入jstl标签库需要使用到jstl的jar包,假如没有加入到eclipse的lib目录下,使用alt+/的时候不会有提示,所以我们需要把这个jar包加进来首先登......
  • springMvc36-JavaEE-JSP基础-EL表达式和JSTL标签库(Taglibs)
    EL表达式和JSTL标签库:在JSP页面代替java代码,便于编写一.EL表达式   作用:${}简化脚本表达式<%=%>   j2ee1.4以前版本需指定<%@pageisELIgnored="false......
  • JSTL常用标签_choose、JSTL常用标签_foreach
    JSTL常用标签_choose2.choose:相当于java代码的switch语句1.使用choose标签声明相当于switch声明2.使用when标签做判断相当于case3.使用otherwise标签做其他情况的......
  • 解题报告——P3477 [POI2008]PER-Permutation
    这道题如果不是任意模数的话还是比较平凡的(这道题的式子其实很好推,根据康托展开的思路,一位一位考虑,只不过是多重集,可能有重复情况,排除即可,每一位的式子为:\[ans_i=\dfrac{......
  • JSTL概述、JSTL常用标签
    JSTL概述概念:JavaServlerPagesTagLibrary标准标签库是开源免费的jsp标签作用:用于简化和替换jsp页面上的java代码使用步骤:导入jstl相......
  • Codeforces 1713C - Build Permutation
    题意为给出一个长度为n的空数组,数组下标为0至n-1。我们需要在数组中的每个位置上填上合适的数A[i],使得i+A[i]为完全平方数。并且数组最后需为0至n-1的一个排列。......
  • [Codeforces_gym_102136] I.Permutations again
    传送门DescriptionGivenasequence\(A_i\)consistingof\(N\)integers.Findthenumberofpairs\((L,R)\)forwhichthesubsegment\({A_L,A_{L + 1},......
  • JSTL_概念和JSTL_常用标签
    JSTL_概念概念:JavaServerPagesTagLibraryJSP标准标签库是由Apache组织提供的开源的免费的jsp标签<标签>作用:用于简化和替换jsp页面上的java代码使用步骤导入j......
  • JSTL讲解
    JSTL概念:JavaServerPagesTagLibraryJSP标准标签库是由Apache组织提供的开源的免费的jsp标签 <标签>作用:用于简化和替换jsp页面上的java代码使用步骤:导......