lintcode32: 最小子串覆盖(详细)

描述

给定一个字符串source和一个目标字符串target,在字符串source找到包括所有目标字符串字母的子串。

如果在source没有这样的子串,返回"",如果有多个这样的子串,返回起始位置最小的子串。

说明

在答案的子串中的字母在目标字符串中是否需要具有相同的顺序?

——不需要。

样例

给出source = "ADOBECODEBANC"target = "ABC" 满足要求的解  "BANC"

题目:找到包含target串中所有字符的最小字串。

思路:

首先采用一个大小为256的数组充当hashmap的功能,记录tartget中字母出现次数。
算法流程如下: 

1. 先将target中所有的字符出现的次数保存到td数组中。

2. 遍历source数组,开始时start=0,i=0;

   start记录当前字串的起点,i相当于当前字串的终点。

    用found表示当前字串中包含target中字符的数目,如果found=target.length()则表明当前字串包含了target中所有字符,如果满足,进入下一步。

3. 将start后移,取出start前面多余的元素,已达到字串最小的目标。

4.判断,如果当前字串小于历史搜到的最小字串,则将当前字串的长度,起始点,结束点都记录,更新。

5.将start后移,寻找下一个字串。

public static String minWindow(String source , String target) {
        // write your code here
        if(source==null || source.length()==0){
            return "";
        }
        if(target==null || target.length()==0){
            return "";
        }
        int[] td = new int[256];
        for (char tc:target.toCharArray()) {
            td[tc]++;
        }
        int[] sd = new int[256];
        int minLen = source.length();
        int start = 0;
        int first = -1, end = 0;
        int found = 0;  // 在source中发现了target中元素的数目
        for (int i = 0; i < source.length(); i++) {
            sd[source.charAt(i)]++;
            if(sd[source.charAt(i)]<=td[source.charAt(i)]){
                found++;
            }
            if(found==target.length()){
                // 满足条件
                // 处理1:start后移,删除无用元素
                while (start<=i && sd[source.charAt(start)] > td[source.charAt(start)]){
                    sd[source.charAt(start)]--;
                    start++;
                }
                // 处理2:如果比当前最小子串小,则更新
                if(i+1-start<=minLen){
                    minLen = i+1-start;
                    first = start;
                    end = i+1;
                }
                sd[source.charAt(start)]--;
                start++;
                found--;
            }
        }
        if(first==-1){
            return "";
        }else{
            return source.substring(first, end);
        }
    }


你可能感兴趣的:(LeetCode)