Skip to content

Commit d4ed399

Browse files
committed
feat: add solutions to lc problem: No.2311
No.2311.Longest Binary Subsequence Less Than or Equal to K
1 parent e1f0f5b commit d4ed399

File tree

8 files changed

+167
-151
lines changed

8 files changed

+167
-151
lines changed

solution/2300-2399/2311.Longest Binary Subsequence Less Than or Equal to K/README.md

+62-59
Original file line numberDiff line numberDiff line change
@@ -53,40 +53,25 @@
5353

5454
**方法一:贪心**
5555

56-
最长二进制子序列必然包含原字符串中所有的 $0$,在此基础上,我们从右到左遍历 $s$,若遇到 $1$,判断子序列能否添加 $1$,使得子序列对应的二进制数字 $v<=k$。
56+
最长二进制子序列必然包含原字符串中所有的 $0$,在此基础上,我们从右到左遍历 $s$,若遇到 $1$,判断子序列能否添加 $1$,使得子序列对应的二进制数字 $v \leq k$。
5757

58-
时间复杂度 $O(n)$,其中 $n$ 表示字符串 $s$ 的长度。
58+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为字符串 $s$ 的长度。
5959

6060
<!-- tabs:start -->
6161

6262
### **Python3**
6363

6464
<!-- 这里可写当前语言的特殊实现逻辑 -->
6565

66-
```python
67-
class Solution:
68-
def longestSubsequence(self, s: str, k: int) -> int:
69-
n = len(s)
70-
ans = s.count('0')
71-
v = 0
72-
for i in range(n - 1, -1, -1):
73-
if s[i] == '1':
74-
if v + (1 << (n - i - 1)) > k:
75-
break
76-
ans += 1
77-
v += 1 << (n - i - 1)
78-
return ans
79-
```
80-
8166
```python
8267
class Solution:
8368
def longestSubsequence(self, s: str, k: int) -> int:
8469
ans = v = 0
8570
for c in s[::-1]:
86-
if c == '0':
71+
if c == "0":
8772
ans += 1
88-
elif v + (1 << ans) <= k:
89-
v += 1 << ans
73+
elif ans < 30 and (v | 1 << ans) <= k:
74+
v |= 1 << ans
9075
ans += 1
9176
return ans
9277
```
@@ -98,16 +83,13 @@ class Solution:
9883
```java
9984
class Solution {
10085
public int longestSubsequence(String s, int k) {
101-
int ans = 0;
102-
long v = 0;
86+
int ans = 0, v = 0;
10387
for (int i = s.length() - 1; i >= 0; --i) {
10488
if (s.charAt(i) == '0') {
10589
++ans;
106-
} else {
107-
if (ans < 32 && v + (1L << ans) <= k) {
108-
v += 1L << ans;
109-
++ans;
110-
}
90+
} else if (ans < 30 && (v | 1 << ans) <= k) {
91+
v |= 1 << ans;
92+
++ans;
11193
}
11294
}
11395
return ans;
@@ -121,13 +103,12 @@ class Solution {
121103
class Solution {
122104
public:
123105
int longestSubsequence(string s, int k) {
124-
int ans = 0;
125-
long long v = 0;
106+
int ans = 0, v = 0;
126107
for (int i = s.size() - 1; ~i; --i) {
127-
if (s[i] == '0')
108+
if (s[i] == '0') {
128109
++ans;
129-
else if (ans < 32 && v + (1ll << ans) <= k) {
130-
v += 1ll << ans;
110+
} else if (ans < 30 && (v | 1 << ans) <= k) {
111+
v |= 1 << ans;
131112
++ans;
132113
}
133114
}
@@ -139,55 +120,77 @@ public:
139120
### **Go**
140121
141122
```go
142-
func longestSubsequence(s string, k int) int {
143-
ans := 0
144-
v := 0
145-
for i := len(s) - 1; i >= 0; i-- {
123+
func longestSubsequence(s string, k int) (ans int) {
124+
for i, v := len(s)-1, 0; i >= 0; i-- {
146125
if s[i] == '0' {
147126
ans++
148-
} else if ans < 32 && v+(1<<ans) <= k {
149-
v += 1 << ans
127+
} else if ans < 30 && (v|1<<ans) <= k {
128+
v |= 1 << ans
150129
ans++
151130
}
152131
}
153-
return ans
132+
return
154133
}
155134
```
156135

157136
### **TypeScript**
158137

159138
```ts
160139
function longestSubsequence(s: string, k: number): number {
161-
let numStr = '';
162-
const n = s.length,
163-
m = s.split('').reduce((a, c) => a + Number(c), 0);
164-
for (let i = n - 1; i >= 0; i--) {
165-
const cur = s.charAt(i).concat(numStr);
166-
if (parseInt(cur, 2) > k) break;
167-
numStr = cur;
140+
let ans = 0;
141+
for (let i = s.length - 1, v = 0; ~i; --i) {
142+
if (s[i] == '0') {
143+
++ans;
144+
} else if (ans < 30 && (v | (1 << ans)) <= k) {
145+
v |= 1 << ans;
146+
++ans;
147+
}
168148
}
169-
return n - m + numStr.split('').reduce((a, c) => a + Number(c), 0);
149+
return ans;
170150
}
171151
```
172152

173-
```ts
174-
function longestSubsequence(s: string, k: number): number {
175-
const cs = s.split('');
176-
const n = s.length;
177-
let i = 0;
178-
while (parseInt(cs.join(''), 2) > k) {
179-
for (let j = i; j < n; j++) {
180-
if (cs[j] === '1') {
181-
cs[j] = '0';
182-
break;
153+
### **C#**
154+
155+
```cs
156+
public class Solution {
157+
public int LongestSubsequence(string s, int k) {
158+
int ans = 0, v = 0;
159+
for (int i = s.Length - 1; i >= 0; --i) {
160+
if (s[i] == '0') {
161+
++ans;
162+
} else if (ans < 30 && (v | 1 << ans) <= k) {
163+
v |= 1 << ans;
164+
++ans;
183165
}
184166
}
185-
i++;
167+
return ans;
186168
}
187-
return n - i;
188169
}
189170
```
190171

172+
### **JavaScript**
173+
174+
```js
175+
/**
176+
* @param {string} s
177+
* @param {number} k
178+
* @return {number}
179+
*/
180+
var longestSubsequence = function (s, k) {
181+
let ans = 0;
182+
for (let i = s.length - 1, v = 0; ~i; --i) {
183+
if (s[i] == '0') {
184+
++ans;
185+
} else if (ans < 30 && (v | (1 << ans)) <= k) {
186+
v |= 1 << ans;
187+
++ans;
188+
}
189+
}
190+
return ans;
191+
};
192+
```
193+
191194
### **...**
192195

193196
```

solution/2300-2399/2311.Longest Binary Subsequence Less Than or Equal to K/README_EN.md

+60-57
Original file line numberDiff line numberDiff line change
@@ -51,30 +51,15 @@ The length of this subsequence is 6, so 6 is returned.
5151

5252
### **Python3**
5353

54-
```python
55-
class Solution:
56-
def longestSubsequence(self, s: str, k: int) -> int:
57-
n = len(s)
58-
ans = s.count('0')
59-
v = 0
60-
for i in range(n - 1, -1, -1):
61-
if s[i] == '1':
62-
if v + (1 << (n - i - 1)) > k:
63-
break
64-
ans += 1
65-
v += 1 << (n - i - 1)
66-
return ans
67-
```
68-
6954
```python
7055
class Solution:
7156
def longestSubsequence(self, s: str, k: int) -> int:
7257
ans = v = 0
7358
for c in s[::-1]:
74-
if c == '0':
59+
if c == "0":
7560
ans += 1
76-
elif v + (1 << ans) <= k:
77-
v += 1 << ans
61+
elif ans < 30 and (v | 1 << ans) <= k:
62+
v |= 1 << ans
7863
ans += 1
7964
return ans
8065
```
@@ -84,16 +69,13 @@ class Solution:
8469
```java
8570
class Solution {
8671
public int longestSubsequence(String s, int k) {
87-
int ans = 0;
88-
long v = 0;
72+
int ans = 0, v = 0;
8973
for (int i = s.length() - 1; i >= 0; --i) {
9074
if (s.charAt(i) == '0') {
9175
++ans;
92-
} else {
93-
if (ans < 32 && v + (1L << ans) <= k) {
94-
v += 1L << ans;
95-
++ans;
96-
}
76+
} else if (ans < 30 && (v | 1 << ans) <= k) {
77+
v |= 1 << ans;
78+
++ans;
9779
}
9880
}
9981
return ans;
@@ -107,13 +89,12 @@ class Solution {
10789
class Solution {
10890
public:
10991
int longestSubsequence(string s, int k) {
110-
int ans = 0;
111-
long long v = 0;
92+
int ans = 0, v = 0;
11293
for (int i = s.size() - 1; ~i; --i) {
113-
if (s[i] == '0')
94+
if (s[i] == '0') {
11495
++ans;
115-
else if (ans < 32 && v + (1ll << ans) <= k) {
116-
v += 1ll << ans;
96+
} else if (ans < 30 && (v | 1 << ans) <= k) {
97+
v |= 1 << ans;
11798
++ans;
11899
}
119100
}
@@ -125,55 +106,77 @@ public:
125106
### **Go**
126107
127108
```go
128-
func longestSubsequence(s string, k int) int {
129-
ans := 0
130-
v := 0
131-
for i := len(s) - 1; i >= 0; i-- {
109+
func longestSubsequence(s string, k int) (ans int) {
110+
for i, v := len(s)-1, 0; i >= 0; i-- {
132111
if s[i] == '0' {
133112
ans++
134-
} else if ans < 32 && v+(1<<ans) <= k {
135-
v += 1 << ans
113+
} else if ans < 30 && (v|1<<ans) <= k {
114+
v |= 1 << ans
136115
ans++
137116
}
138117
}
139-
return ans
118+
return
140119
}
141120
```
142121

143122
### **TypeScript**
144123

145124
```ts
146125
function longestSubsequence(s: string, k: number): number {
147-
let numStr = '';
148-
const n = s.length,
149-
m = s.split('').reduce((a, c) => a + Number(c), 0);
150-
for (let i = n - 1; i >= 0; i--) {
151-
const cur = s.charAt(i).concat(numStr);
152-
if (parseInt(cur, 2) > k) break;
153-
numStr = cur;
126+
let ans = 0;
127+
for (let i = s.length - 1, v = 0; ~i; --i) {
128+
if (s[i] == '0') {
129+
++ans;
130+
} else if (ans < 30 && (v | (1 << ans)) <= k) {
131+
v |= 1 << ans;
132+
++ans;
133+
}
154134
}
155-
return n - m + numStr.split('').reduce((a, c) => a + Number(c), 0);
135+
return ans;
156136
}
157137
```
158138

159-
```ts
160-
function longestSubsequence(s: string, k: number): number {
161-
const cs = s.split('');
162-
const n = s.length;
163-
let i = 0;
164-
while (parseInt(cs.join(''), 2) > k) {
165-
for (let j = i; j < n; j++) {
166-
if (cs[j] === '1') {
167-
cs[j] = '0';
168-
break;
139+
### **C#**
140+
141+
```cs
142+
public class Solution {
143+
public int LongestSubsequence(string s, int k) {
144+
int ans = 0, v = 0;
145+
for (int i = s.Length - 1; i >= 0; --i) {
146+
if (s[i] == '0') {
147+
++ans;
148+
} else if (ans < 30 && (v | 1 << ans) <= k) {
149+
v |= 1 << ans;
150+
++ans;
169151
}
170152
}
171-
i++;
153+
return ans;
172154
}
173-
return n - i;
174155
}
175156
```
176157

158+
### **JavaScript**
159+
160+
```js
161+
/**
162+
* @param {string} s
163+
* @param {number} k
164+
* @return {number}
165+
*/
166+
var longestSubsequence = function (s, k) {
167+
let ans = 0;
168+
for (let i = s.length - 1, v = 0; ~i; --i) {
169+
if (s[i] == '0') {
170+
++ans;
171+
} else if (ans < 30 && (v | (1 << ans)) <= k) {
172+
v |= 1 << ans;
173+
++ans;
174+
}
175+
}
176+
return ans;
177+
};
178+
```
179+
177180
### **...**
178181

179182
```

solution/2300-2399/2311.Longest Binary Subsequence Less Than or Equal to K/Solution.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
class Solution {
22
public:
33
int longestSubsequence(string s, int k) {
4-
int ans = 0;
5-
long long v = 0;
4+
int ans = 0, v = 0;
65
for (int i = s.size() - 1; ~i; --i) {
7-
if (s[i] == '0')
6+
if (s[i] == '0') {
87
++ans;
9-
else if (ans < 32 && v + (1ll << ans) <= k) {
10-
v += 1ll << ans;
8+
} else if (ans < 30 && (v | 1 << ans) <= k) {
9+
v |= 1 << ans;
1110
++ans;
1211
}
1312
}

0 commit comments

Comments
 (0)