longest-substring-with-at-least-k-repeating-characters
https://leetcode.com/problems/longest-substring-with-at-least-k-repeating-characters/
public class Solution {
public int longestSubstring(String s, int k) {
// Find count of each char
HashMap mp = new HashMap();
Object intObj;
for (int i=0; i<s.length(); i++) {
char ch = s.charAt(i);
intObj = mp.remove(ch);
int st = 0;
if (intObj != null) {
st = (int) intObj;
}
st++;
mp.put(ch, st);
}
// prepre iterate secondly
int ret = 0;
int last = -1;
HashMap newMp = new HashMap();
// iterate secondly
for (int i=0; i<s.length(); i++) {
char ch = s.charAt(i);
int num = (int)mp.get(ch);
// pass if num fits
if (num >= k) {
intObj = newMp.get(ch);
int newNum = 0;
if (intObj != null) {
newNum = (int) intObj;
}
newNum++;
newMp.put(ch, newNum);
continue;
}
// handle if meets nofit char
Set filter = new HashSet();
Iterator iter = newMp.entrySet().iterator();
Map.Entry entry;
// check newMp and prepare filter
while (iter.hasNext()) {
entry = (Map.Entry) iter.next();
char cch = (char)entry.getKey();
int cnt = (int)entry.getValue();
if (cnt < k) {
filter.add(cch);
}
int allCnt = (int)mp.remove(cch);
allCnt -= cnt;
mp.put(cch, allCnt);
}
// Prune
if (filter.size() == newMp.size()) {
last = i;
newMp.clear();
continue;
}
// use filter to check each segment
HashMap fMp = new HashMap();
int newLast = last;
for (int j=last+1; j<=i; j++) {
char fch = ' ';
if (j < i) {
fch = s.charAt(j);
}
// need to check segment
if (j == i || filter.contains(fch)) {
iter = fMp.entrySet().iterator();
// check map of each segment
while (iter.hasNext()) {
entry = (Map.Entry) iter.next();
char ffch = (char)entry.getKey();
int fcnt = (int)entry.getValue();
// Prepare Prune by update newMp
int newCnt = (int)newMp.remove(ffch);
newCnt -= fcnt;
newMp.put(ffch, newCnt);
if (newCnt < k) {
filter.add(ffch);
}
}
newLast = j;
fMp.clear();
// Check Prune
if (filter.size() == newMp.size()) {
break;
}
}
// no need to check segment, pass
else {
intObj = fMp.get(fch);
int fNum = 0;
if (intObj != null) {
fNum = (int) intObj;
}
fNum++;
fMp.put(fch, fNum);
if (fNum >= k) {
iter = fMp.entrySet().iterator();
boolean isFit = true;
while (iter.hasNext()) {
entry = (Map.Entry) iter.next();
int cfcnt = (int)entry.getValue();
if (cfcnt < k) {
isFit = false;
break;
}
}
if (isFit) {
if (j-newLast > ret) {
ret = j-newLast;
}
}
}
}
}
newMp.clear();
last = i;
}
if (s.length()-last-1 > ret) {
ret = s.length()-last-1;
}
return ret;
}
}
下面那个有未考虑到的地方,比如:
aaabbcbdcc
3
下面得出0,其实应该是3.
public class Solution { public int longestSubstring(String s, int k) { // Find count of each char HashMap mp = new HashMap(); Object intObj; for (int i=0; i<s.length(); i++) { char ch = s.charAt(i); intObj = mp.remove(ch); int st = 0; if (intObj != null) { st = (int) intObj; } st++; mp.put(ch, st); } // prepre iterate secondly int ret = 0; int last = -1; HashMap newMp = new HashMap(); // iterate secondly for (int i=0; i<s.length(); i++) { char ch = s.charAt(i); int num = (int)mp.get(ch); // pass if num fits if (num >= k) { intObj = newMp.get(ch); int newNum = 0; if (intObj != null) { newNum = (int) intObj; } newNum++; newMp.put(ch, newNum); continue; } // handle if meets nofit char Set filter = new HashSet(); Iterator iter = newMp.entrySet().iterator(); Map.Entry entry; // check newMp and prepare filter while (iter.hasNext()) { entry = (Map.Entry) iter.next(); char cch = (char)entry.getKey(); int cnt = (int)entry.getValue(); if (cnt < k) { filter.add(cch); } int allCnt = (int)mp.remove(cch); allCnt -= cnt; mp.put(cch, allCnt); } // Prune if (filter.size() == newMp.size()) { last = i; newMp.clear(); continue; } // use filter to check each segment HashMap fMp = new HashMap(); int newLast = last; for (int j=last+1; j<=i; j++) { char fch = ' '; if (j < i) { fch = s.charAt(j); } // need to check segment if (j == i || filter.contains(fch)) { iter = fMp.entrySet().iterator(); boolean fits = true; // check map of each segment while (iter.hasNext()) { entry = (Map.Entry) iter.next(); char ffch = (char)entry.getKey(); int fcnt = (int)entry.getValue(); if (fcnt < k) { fits = false; } // Prepare Prune by update newMp int newCnt = (int)newMp.remove(ffch); newCnt -= fcnt; newMp.put(ffch, newCnt); if (newCnt < k) { filter.add(ffch); } } // update final ret if (fits) { if (j-newLast-1 > ret) { ret = j-newLast-1; } } newLast = j; fMp.clear(); // Check Prune if (filter.size() == newMp.size()) { break; } } // no need to check segment, pass else { intObj = fMp.get(fch); int fNum = 0; if (intObj != null) { fNum = (int) intObj; } fNum++; fMp.put(fch, fNum); } } newMp.clear(); last = i; } if (s.length()-last-1 > ret) { ret = s.length()-last-1; } return ret; } } test case: "zzzzzzzzzzaaaaaaaaabbbbbbbbhbhbhbhbhbhbhicbcbcibcbccccccccccbbbbbbbbaaaaaaaaafffaahhhhhiaahiiiiiiiiifeeeeeeeeee" 10 expected return: 21
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!