题解 | 小红的排列构造②

小红的排列构造②

https://www.nowcoder.com/practice/a4ec29e74aaa450aa8a4200fe3b06308

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vl vector<ll>
#define vi vector<int>
#define vc vector<char>
#define vs vector<string>
#define pq priority_queue
#define endl '\n'
#define Hashset unordered_set
#define Hashmap unordered_map
#define PLL pair<ll,ll>
#define PII pair<int,int>
#define ull unsigned long long
int n;
string s;
void R(int l,int r,vi &nums){
    while(l<r){
        swap(nums[l],nums[r]);
        l++;
        r--;
    }
}
void sol(){
    cin >> n;
    cin >> s;
    if(s[s.size()-1]=='0'){
        cout << -1 << endl;
        return;
    }
    vi nums(n,0);
    for(int i=0;i<n;i++){
        nums[i]=i+1;
    }
    int zero_pos=-1;
    int one_pos=-1;
    for(int i=0;i<s.size();i++){
        if(s[i]=='0'&&zero_pos==-1){
            zero_pos=i;
        }
        else if(s[i]=='1'&&zero_pos!=-1){
            one_pos=i;
            R(zero_pos,one_pos,nums);
            zero_pos=-1;
        }
    }
    for(int i=0;i<s.size();i++){
        if(i)cout << " ";
        cout << nums[i];
    }
    cout << endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    //cin >> T;
    while(T--){
        sol();
    }
}

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vi vector<int>
#define um unordered_map
#define us unordered_set
int n;
string s;
bool ans = false;
bool check(vi& nums) {
    us<int>Hashset;
    us<int>n;
    for (int i = 0; i < nums.size(); i++) {
        Hashset.insert(i + 1);
        n.insert(nums[i]);
        if ((s[i] == '0' && Hashset != n) || (s[i] == '1' && Hashset == n)) {
            continue;
        } else {
            return false;
        }
    }
    return true;
}
void Swap(int p1, int p2, vi& nums) {
    int temp = nums[p1];
    nums[p1] = nums[p2];
    nums[p2] = temp;
}
void f(int i, vi& nums) {
    if (i == n) {
        if (check(nums)) {
            ans = true;
            for (int i = 0; i < n; i++) {
                if (i) cout << " ";
                cout << nums[i];
            }
            cout << endl;
        }
        return;
    }
    for (int j = i; j < nums.size(); j++) {
        Swap(j, i, nums);
        f(i + 1, nums);
        Swap(j, i, nums);
    }
}
void sol() {
    cin >> n;
    cin >> s;
    vi nums(n, 0);
    for (int i = 0; i < n; i++) {
        nums[i] = i + 1;
    }
    f(0, nums);
    if (!ans)cout << -1 << endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T = 1;
    //cin >> T;
    while (T--)sol();
    return 0;
}

对于一般构造题而言,即使推理和洞察能力不强也可以尝试打表找规律,利用递归DFS全排列出n的排列然后与字符串s进行校验,正确则返回,打表后发现对于最简单的排列123...n(这边可能有更好的发现)而言0000...1这样的多0末尾1区间进行翻转就是一种答案

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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