全排列 P135 王道

//全排列 P135 王道
//方法一:递归
//https://www.nowcoder.com/practice/5632c23d0d654aecbc9315d1720421c1?tpId=61&tqId=29515&tPage=1&ru=/kaoyan/retest/1002&qru=/ta/pku-kaoyan/question-ranking
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
const int MAXN = 10;
bool visit[MAXN]; //不需要赋初始值么?
char sequence[MAXN];

void GetPermutation(string str,int index){
    if(index == str.size()){
        for(int i=0;i<str.size();++i){
            printf("%c",sequence[i]);
        }
        printf("\n");
    }

    for(int i=0;i<str.size();++i){
        if(visit[i]){
            continue;
        }
        visit[i] = true;
        sequence[index] = str[i];


        GetPermutation(str,index+1); // 往下面一层访问
        visit[i] = false;//里面有回溯 访问完自己后要把自己置掉
    }
    return;

}
int main(){
    string str;
    while(cin>>str){
        sort(str.begin(),str.end()); //对字符串进行排序
        GetPermutation(str,0);
        printf("\n"); //每组样例输出结束后要再输出一个回车。

    }


    return 0;
}


//全排列 P135 王道
//方法2:非递归
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;

string str;
bool  GetNextPermutation(){
    int n = str.size();
    int index = n-1;
    while(index >= 1 && str[index] < str[index-1]){
        index--;
    }
    index--;
    if(index < 0) return false;

    for(int i=n-1;i>index;--i){
        if(str[index] < str[i]){
           swap(str[index],str[i]);
            break;

        }
    }

    reverse(str.begin()+index+1,str.end());

    return true;

}
int main(){

    while(cin>>str){
        sort(str.begin(),str.end()); //对字符串进行排序
        do {
            cout<<str<<endl;
        }while(GetNextPermutation());
        printf("\n"); //每组样例输出结束后要再输出一个回车。

    }


    return 0;
}



//全排列 P135 王道 //方法3:系统函数 #include <iostream> #include <cstdio> #include <string> #include <algorithm> using namespace std; int main(){ string str; while(cin>>str){ sort(str.begin(),str.end()); //对字符串进行排序  do { cout<<str<<endl;
        }while(next_permutation(str.begin(),str.end())); printf("\n"); //每组样例输出结束后要再输出一个回车。   } return 0;
}


全部评论

相关推荐

11-06 23:30
已编辑
华中师范大学 后端工程师
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务