Skip to content

Commit a7439f9

Browse files
committed
feat: add solutions to lc problem: No.2014
No.2014.Longest Subsequence Repeated k Times
1 parent 9a9eb75 commit a7439f9

File tree

7 files changed

+655
-8
lines changed

7 files changed

+655
-8
lines changed

solution/2000-2099/2014.Longest Subsequence Repeated k Times/README.md

Lines changed: 222 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,32 +80,250 @@ tags:
8080

8181
<!-- solution:start -->
8282

83-
### 方法一
83+
### 方法一:BFS
84+
85+
我们可以先统计字符串中每个字符出现的次数,然后将出现次数大于等于 $k$ 的字符按从小到大的顺序存入一个列表 $\textit{cs}$ 中。接下来,我们可以使用 BFS 来枚举所有可能的子序列。
86+
87+
我们定义一个队列 $\textit{q}$,初始时将空字符串放入队列中。然后,我们从队列中取出一个字符串 $\textit{cur}$,并尝试将每个字符 $c \in \textit{cs}$ 添加到 $\textit{cur}$ 的末尾,形成一个新的字符串 $\textit{nxt}$。如果 $\textit{nxt}$ 是一个重复 $k$ 次的子序列,我们就将其加入到答案中,并将 $\textit{nxt}$ 放入队列中继续处理。
88+
89+
我们需要一个辅助函数 $\textit{check(t, k)}$ 来判断字符串 $\textit{t}$ 是否是字符串 $s$ 的一个重复 $k$ 次的子序列。具体地,我们可以使用两个指针来遍历字符串 $s$ 和 $\textit{t}$,如果在遍历过程中能够找到 $\textit{t}$ 的所有字符,并且能够重复 $k$ 次,那么就返回 $\textit{true}$,否则返回 $\textit{false}$。
8490

8591
<!-- tabs:start -->
8692

8793
#### Python3
8894

8995
```python
90-
96+
class Solution:
97+
def longestSubsequenceRepeatedK(self, s: str, k: int) -> str:
98+
def check(t: str, k: int) -> bool:
99+
i = 0
100+
for c in s:
101+
if c == t[i]:
102+
i += 1
103+
if i == len(t):
104+
k -= 1
105+
if k == 0:
106+
return True
107+
i = 0
108+
return False
109+
110+
cnt = Counter(s)
111+
cs = [c for c in ascii_lowercase if cnt[c] >= k]
112+
q = deque([""])
113+
ans = ""
114+
while q:
115+
cur = q.popleft()
116+
for c in cs:
117+
nxt = cur + c
118+
if check(nxt, k):
119+
ans = nxt
120+
q.append(nxt)
121+
return ans
91122
```
92123

93124
#### Java
94125

95126
```java
96-
127+
class Solution {
128+
private char[] s;
129+
130+
public String longestSubsequenceRepeatedK(String s, int k) {
131+
this.s = s.toCharArray();
132+
int[] cnt = new int[26];
133+
for (char c : this.s) {
134+
cnt[c - 'a']++;
135+
}
136+
137+
List<Character> cs = new ArrayList<>();
138+
for (char c = 'a'; c <= 'z'; ++c) {
139+
if (cnt[c - 'a'] >= k) {
140+
cs.add(c);
141+
}
142+
}
143+
Deque<String> q = new ArrayDeque<>();
144+
q.offer("");
145+
String ans = "";
146+
while (!q.isEmpty()) {
147+
String cur = q.poll();
148+
for (char c : cs) {
149+
String nxt = cur + c;
150+
if (check(nxt, k)) {
151+
ans = nxt;
152+
q.offer(nxt);
153+
}
154+
}
155+
}
156+
return ans;
157+
}
158+
159+
private boolean check(String t, int k) {
160+
int i = 0;
161+
for (char c : s) {
162+
if (c == t.charAt(i)) {
163+
i++;
164+
if (i == t.length()) {
165+
if (--k == 0) {
166+
return true;
167+
}
168+
i = 0;
169+
}
170+
}
171+
}
172+
return false;
173+
}
174+
}
97175
```
98176

99177
#### C++
100178

101179
```cpp
102-
180+
class Solution {
181+
public:
182+
string longestSubsequenceRepeatedK(string s, int k) {
183+
auto check = [&](const string& t, int k) -> bool {
184+
int i = 0;
185+
for (char c : s) {
186+
if (c == t[i]) {
187+
i++;
188+
if (i == t.size()) {
189+
if (--k == 0) {
190+
return true;
191+
}
192+
i = 0;
193+
}
194+
}
195+
}
196+
return false;
197+
};
198+
int cnt[26] = {};
199+
for (char c : s) {
200+
cnt[c - 'a']++;
201+
}
202+
203+
vector<char> cs;
204+
for (char c = 'a'; c <= 'z'; ++c) {
205+
if (cnt[c - 'a'] >= k) {
206+
cs.push_back(c);
207+
}
208+
}
209+
210+
queue<string> q;
211+
q.push("");
212+
string ans;
213+
while (!q.empty()) {
214+
string cur = q.front();
215+
q.pop();
216+
for (char c : cs) {
217+
string nxt = cur + c;
218+
if (check(nxt, k)) {
219+
ans = nxt;
220+
q.push(nxt);
221+
}
222+
}
223+
}
224+
return ans;
225+
}
226+
};
103227
```
104228

105229
#### Go
106230

107231
```go
232+
func longestSubsequenceRepeatedK(s string, k int) string {
233+
check := func(t string, k int) bool {
234+
i := 0
235+
for _, c := range s {
236+
if byte(c) == t[i] {
237+
i++
238+
if i == len(t) {
239+
k--
240+
if k == 0 {
241+
return true
242+
}
243+
i = 0
244+
}
245+
}
246+
}
247+
return false
248+
}
249+
250+
cnt := [26]int{}
251+
for i := 0; i < len(s); i++ {
252+
cnt[s[i]-'a']++
253+
}
254+
255+
cs := []byte{}
256+
for c := byte('a'); c <= 'z'; c++ {
257+
if cnt[c-'a'] >= k {
258+
cs = append(cs, c)
259+
}
260+
}
261+
262+
q := []string{""}
263+
ans := ""
264+
for len(q) > 0 {
265+
cur := q[0]
266+
q = q[1:]
267+
for _, c := range cs {
268+
nxt := cur + string(c)
269+
if check(nxt, k) {
270+
ans = nxt
271+
q = append(q, nxt)
272+
}
273+
}
274+
}
275+
return ans
276+
}
277+
```
108278

279+
#### TypeScript
280+
281+
```ts
282+
function longestSubsequenceRepeatedK(s: string, k: number): string {
283+
const check = (t: string, k: number): boolean => {
284+
let i = 0;
285+
for (const c of s) {
286+
if (c === t[i]) {
287+
i++;
288+
if (i === t.length) {
289+
k--;
290+
if (k === 0) {
291+
return true;
292+
}
293+
i = 0;
294+
}
295+
}
296+
}
297+
return false;
298+
};
299+
300+
const cnt = new Array(26).fill(0);
301+
for (const c of s) {
302+
cnt[c.charCodeAt(0) - 97]++;
303+
}
304+
305+
const cs: string[] = [];
306+
for (let i = 0; i < 26; ++i) {
307+
if (cnt[i] >= k) {
308+
cs.push(String.fromCharCode(97 + i));
309+
}
310+
}
311+
312+
const q: string[] = [''];
313+
let ans = '';
314+
while (q.length > 0) {
315+
const cur = q.shift()!;
316+
for (const c of cs) {
317+
const nxt = cur + c;
318+
if (check(nxt, k)) {
319+
ans = nxt;
320+
q.push(nxt);
321+
}
322+
}
323+
}
324+
325+
return ans;
326+
}
109327
```
110328

111329
<!-- tabs:end -->

0 commit comments

Comments
 (0)