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

longest-substring-with-at-least-k-repeating-characters的更多相关文章

  1. 395. Longest Substring with At Least K Repeating Characters

    395. Longest Substring with At Least K Repeating Characters 我的思路是先扫描一遍,然后判断是否都满足,否则,不满足的字符一定不出现,可以作为 ...

  2. [LeetCode] Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子字符串

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...

  3. [LeetCode] 395. Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子字符串

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...

  4. [Swift]LeetCode395. 至少有K个重复字符的最长子串 | Longest Substring with At Least K Repeating Characters

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...

  5. LeetCode 395. Longest Substring with At Least K Repeating Characters C#

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...

  6. 2016/9/21 leetcode 解题笔记 395.Longest Substring with At Least K Repeating Characters

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...

  7. Leetcode: Longest Substring with At Least K Repeating Characters

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...

  8. leetcode 395. Longest Substring with At Least K Repeating Characters

    Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...

  9. 【LeetCode】395. Longest Substring with At Least K Repeating Characters 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/longest- ...

  10. leetcode 395. Longest Substring with At Least K Repeating Characters(高质量题)

    只能说还是太菜,抄的网上大神的做法: idea: mask 的每一位代表该位字母够不够k次,够k次为0,不够为1 对于每一位将其视为起点,遍历至末尾,找到其最大满足子串T的下标max_idx,之后从m ...

随机推荐

  1. idea在debug模式启动非常慢,日志正常debug模式一直在启动中状态

    背景 最近在使用idea开发工具时遇到了一个奇怪的现象,使用run tomcat项目可以正常启动,但是使用debug模式启动时,控制台可以正常打印日志,但是进度十分缓慢,也没有任何报出任何错误信息.只 ...

  2. Openstack-开发基础 stevedore学习

    在给openstack-N版加路由的时候发现怎么都无法搞定,原来现在用这个模块来处理了 stevedore是用来实现动态加载代码的开源模块.它是在OpenStack中用来加载插件的公共模块.可以独立于 ...

  3. python opencv3 读写图像文件

    git: https://github.com/linyi0604/Computer-Vision # coding:utf8 import cv2 # 读取一张图片, 第二个参数可选 image = ...

  4. 什么是DHTML?

    DHTML是近年来网络发展进程中最振奋人心也最具实用性的创新之一.它是一种通过各种技术的综合发展而得以实现的概念(当然,不同的浏览器,实现的程度也不同),这些技术包括Javascript, VBScr ...

  5. 热爱编程,热爱生活,快速适应IT新技术

    现在新技术层出不穷,我们没有那么多时间去深入学习每一门.对于大多数技术,我们只需要搞懂概念部分,从宏观上了解一下,决定我们要不要深入地去学习它.有了这些了解,就能轻松地与别人聊天了,也可以为以后技术选 ...

  6. Codeforces Round #361 (Div. 2) B. Mike and Shortcuts bfs

    B. Mike and Shortcuts 题目连接: http://www.codeforces.com/contest/689/problem/B Description Recently, Mi ...

  7. 快速定位问题 Request无法获取参数

    比如说最近开发甲修改了iframe标签的src,开发乙在设置src的时候传入了2个参数,通过iframe标签链接到这个页面时,开发乙调试时发现没有拿到任何参数值.然后开发乙百度了一下,发现iframe ...

  8. python 编程语言基础技术框架

    python标识符身份 id方法查看唯一标示符,内存地址 >>> a = "str" >>> b = 2 >>> id(a) ...

  9. Git_集中式vs分布式

    创建版本库 时光机穿梭 版本回退 工作区和暂存区 管理修改 撤销修改 删除文件 远程仓库 添加远程库 从远程库克隆 分支管理 创建与合并分支 解决冲突 分支管理策略 Bug分支 Feature分支 多 ...

  10. jQuery动画高级用法(上)——详解animation中的.queue()函数

    如果你拿着一个疑问去找专业人士寻找答案,那么你的一个疑问会变成三个,因为他会用另外两个令你更加一头雾水的名词来解释你的这个疑问. 我想这是大多数,包括我在内,IT人在学习过程中碰到的最大问题.当你有一 ...