zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    关于集合中的实现细节
    数组与内存控制笔记
    python进阶------进程线程(五)
    python进阶------进程线程(四)
    python进阶------进程线程(三)
    python进阶-------进程线程(二)
    python进阶------进程线程(一)
    python进阶---Python中的socket编程
    Python基础---python中的异常处理
    Python进阶---面向对象第三弹(进阶篇)
  • 原文地址:https://www.cnblogs.com/charlesblc/p/5879401.html
Copyright © 2011-2022 走看看