• 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
  • 相关阅读:
    又玩起了“数独”
    WebService应用:音乐站图片上传
    大家都来DIY自己的Blog啦
    CSS导圆角,不过这个代码没有怎么看懂,与一般的HTML是不同
    网站PR值
    CommunityServer2.0何去何从?
    网络最经典命令行
    炎热八月,小心"落雪"
    Topology activation failed. Each partition must have at least one index component from the previous topology in the new topology, in the same host.
    SharePoint 2013服务器场设计的一些链接
  • 原文地址:https://www.cnblogs.com/charlesblc/p/5879401.html
Copyright © 2020-2023  润新知