leetcode-76. Minimum Window Substring

leetcode-76. Minimum Window Substring

题目L:

Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).

For example,
S = “ADOBECODEBANC”
T = “ABC”
Minimum window is “BANC”.

说起来比较简单但是实现的过程确比较复杂。而且目前应该也不是最简过程。
首先我先建立一个HashMap表,并累计所有t中的值,然后初始化窗口,如果遍历整s都没有找到合适的窗口则返回”“;
然后维护这个窗函数,不断向右移动左窗口,直到其窗口右边达到右边,寻找在此过程中的最小窗口。
返回最小的窗口

public class Solution {
    public String minWindow(String s, String t) {
        if(t.equals(""))return "";
        HashMap<Character,Integer> map = new HashMap<Character,Integer>();
        for(int i = 0; i < t.length();i++){
            map.put(t.charAt(i),map.containsKey(t.charAt(i))? map.get(t.charAt(i))+1:1);
        }
        int r = 0;
        while(!verify(map) && r<s.length()){
            if(map.containsKey(s.charAt(r))){
                map.put(s.charAt(r),map.get(s.charAt(r))-1);
            }
            r++;
        }
        int l = 0;
        String ret = s;
        if(verify(map)){
            ret = s.substring(0,r);
        }else{
            return "";
        }
        while(r<=s.length()){
            while(verify(map)){
                if(r-l<ret.length()) ret = s.substring(l,r);
                if(map.containsKey(s.charAt(l))){
                    map.put(s.charAt(l),map.get(s.charAt(l))+1);
                }
                l++;
            }
            if(r<s.length() && map.containsKey(s.charAt(r))){
                    map.put(s.charAt(r),map.get(s.charAt(r))-1);
            }
            r++;
        }
        return ret;
    }

    private boolean verify(HashMap<Character,Integer> map){
        for(int i : map.values())
            if(i>0) return false;
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值