跳到主要内容

395.至少有K个重复字符的最长子串

链接:395.至少有K个重复字符的最长子串
难度:Medium
标签:哈希表、字符串、分治、滑动窗口
简介:给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。

题解 1 - typescript

  • 编辑时间:2021-07-29
  • 执行用时:80ms
  • 内存消耗:40.4MB
  • 编程语言:typescript
  • 解法介绍:分割字符串分别统计。
function longestSubstring(s: string, k: number): number {
const map: Record<string, number> = {};
for (const c of s) map[c] = (map[c] ?? 0) + 1;
const splits: number[] = [];
for (let i = 0; i < s.length; i++) {
if (map[s[i]] < k) splits.push(i);
}
splits.push(s.length);
if (splits.length === 1) return s.length;
let pre = 0;
let ans = 0;
for (const p of splits) {
const len = p - pre;
if (len >= k) {
ans = Math.max(ans, longestSubstring(s.substr(pre, len), k));
}
pre = p + 1;
}
return ans;
}

题解 2 - typescript

  • 编辑时间:2021-02-27
  • 执行用时:88ms
  • 内存消耗:40.3MB
  • 编程语言:typescript
  • 解法介绍:递归,分治。
function longestSubstring(s: string, k: number): number {
const len = s.length;
if (len === 0) return 0;
if (len === 1) return +(k === 1);
const map: Record<string, number> = {};
for (const c of s) map[c] = (map[c] ?? 0) + 1;
const regStr = Object.keys(map)
.filter(key => map[key] < k)
.join('|');
if (regStr.length === 0) return s.length;
const arr = s.split(new RegExp(regStr));
return Math.max(...arr.map(str => longestSubstring(str, k)));
}

题解 3 - typescript

  • 编辑时间:2021-02-27
  • 执行用时:148ms
  • 内存消耗:42.2MB
  • 编程语言:typescript
  • 解法介绍:读取可能值进行最长比较。
function longestSubstring(s: string, k: number): number {
const len = s.length;
if (len === 1) return +(k === 1);
const map: Record<string, number> = {};
for (const c of s) map[c] = (map[c] ?? 0) + 1;
const set = new Set(
Object.entries(map)
.filter(([, v]) => v < k)
.map(([k]) => k)
);
const runtimeMap = new Map<string, number>();
const runtimeSet = new Set<string>();
let ans = 0;
for (let i = 0; i < len; i++) {
const c = s[i];
if (set.has(c)) continue;
runtimeMap.clear();
runtimeSet.clear();
runtimeMap.set(c, 1);
if (k > 1) runtimeSet.add(c);
let lastIndex = i;
while (++lastIndex < len) {
const newChar = s[lastIndex];
if (set.has(newChar)) break;
const charCount = (runtimeMap.get(newChar) ?? 0) + 1;
runtimeMap.set(newChar, charCount);
charCount >= k ? runtimeSet.delete(newChar) : runtimeSet.add(newChar);
if (runtimeSet.size === 0) ans = Math.max(ans, lastIndex - i + 1);
}
}
return ans;
}

题解 4 - typescript

  • 编辑时间:2021-02-27
  • 执行用时:100ms
  • 内存消耗:40.4MB
  • 编程语言:typescript
  • 解法介绍:递归,分治。
function longestSubstring(s: string, k: number): number {
const len = s.length;
if (len === 0) return 0;
if (len === 1) return +(k === 1);
const map: Record<string, number> = {};
for (const c of s) map[c] = (map[c] ?? 0) + 1;
const regStr = Object.entries(map)
.filter(([, v]) => v < k)
.map(([k]) => k)
.join('|');
if (regStr.length === 0) return s.length;
const arr = s.split(new RegExp(regStr));
return Math.max(...arr.map(str => longestSubstring(str, k)));
}

题解 5 - typescript

  • 编辑时间:2021-02-27
  • 执行用时:88ms
  • 内存消耗:40.3MB
  • 编程语言:typescript
  • 解法介绍:递归,分治。
function longestSubstring(s: string, k: number): number {
const len = s.length;
if (len === 0) return 0;
if (len === 1) return +(k === 1);
const map: Record<string, number> = {};
for (const c of s) map[c] = (map[c] ?? 0) + 1;
const regStr = Object.keys(map)
.filter(key => map[key] < k)
.join('|');
if (regStr.length === 0) return s.length;
const arr = s.split(new RegExp(regStr));
return Math.max(...arr.map(str => longestSubstring(str, k)));
}