我是弱弱,用0-2的n次方之后转化二进制来生成所有的01字符,再将其中00不相邻数组以字符串的形式存入结构体,并将他的十进制与0的个数同时存入,然后排序,排序时1优先0的个数,其次10进制大小,正如我先前所说我是弱弱所以写的比较麻烦
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef struct zifu
{
string chang;
int cnt;
int n;
} zif;
int pan(int arr[], int n)
{
for(int i = 0; i < n - 1; i++)
{
if(arr[i] == 0 && arr[i + 1] == 0) return 0;
}
return 1;
}
bool pai(const zif &a, const zif &b)
{
if(a.cnt == b.cnt) return a.n < b.n;
return a.cnt > b.cnt;
}
class Solution {
public:
vector<string> validStrings(int n) {
int cnt, arr[1200000];
int l = pow(2, n), l2 = pow(2, n) - 1;
zif s[1210000];
int si = 0;
for(int i = 0; i < l; i++)
{
cnt = 0;
int i2 = i, i3 = 0;
while(i2)
{
arr[i3++] = i2 % 2;
if(i2 % 2 == 0) cnt++;
i2 /= 2;
}
while(i3 < n)
{
cnt++;
arr[i3++] = 0;
}
if(pan(arr, n))
{
s[si].n = i;
s[si].cnt = cnt;
s[si].chang = "";
for(int i4 = n - 1; i4 >= 0; i4--)
{
s[si].chang += arr[i4] + '0';
}
si++;
}
}
sort(s, s + si, pai);
vector<string> result;
for(int i = 0; i < si; i++)
{
result.push_back(s[i].chang);
}
return result;
}
};