观察到以下规律:如果[1, 2, ... , n]的第k<n位和最后一位交换,那么[0,n)依旧是一个排列,而[0,k]不是一个排列。所以算法如下:从1 2 3 4 5 ... n开始对每个'0'的位置 i,总是找其后面的第一个'1'位置 j,交换perm[i],perm[j]。 #include <bits/stdc++.h> using namespace std; int main() { int n; string s; cin >> n >> s; vector<int> perm(n); int j=0; int i; for ...