Minimum string array coverage

Description

Given a string collection tag_list, an array of strings all_tags, find the smallest all_tags sub-array contains all the string in the tag_list, output the length of this sub-array. If there is no return-1.

1 <= |tag_list|,|all_tags| <=10000
All string length <= 50

Example

Given tag_list =["made","in","china"], all_tags =["made", "a","b","c","in", "china","made","b","c","d"], return3.

Explanation:
["in", "china","made"] contains all the strings in tag_list,6 - 4 + 1 = 3.

Given tag_list =["a"], all_tags =["b"], return-1.

Explanation:
Does not exist.

分析

夹逼法,此题假设target里的没有duplicate,2个Map做

先m1里存所有target和count,m2用来后来增减target

右边for loop前进,如果遇到target就存入m2,直到存满所有target:m2.size() = target.size(),就可以开始减少left开始夹逼

夹逼的while里,一定要记得判断left也是target才能进入m2的操作

结尾记得判断如果长度就是all tags,就是不存在,返回-1

public class Solution {
    /**
     * @param tagList: The tag list.
     * @param allTags: All the tags.
     * @return: Return the answer
     */

    public int getMinimumStringArray(String[] tagList, String[] allTags) {
        // Write your code here
        Map<String, Integer> m1 = new HashMap<>();
        Map<String, Integer> m2 = new HashMap<>();
        //先把所有target的数字都加入map
        for(String s : tagList) {
            m1.put(s, 1);
        }

        int ans = allTags.length;
        int l = 0;
        for(int r = 0; r < allTags.length; r++) {
            //右边一直走,然后左边慢慢缩小,夹逼得方法
            if(m1.containsKey(allTags[r])) {
                //右边走,遇到target的存在的都加入m2
                if(m2.containsKey(allTags[r])) {
                     m2.put(allTags[r],  m2.get(allTags[r]) + 1);
                } else {
                    m2.put(allTags[r], 1);
                }
               //左边开始夹逼
               while(l < r && m2.size() == tagList.length) {
                   ans = Math.min(ans, r - l + 1);
                   //l必须是target里的才行
                   if(m1.containsKey(allTags[l])) {
                       if(m2.get(allTags[l]) == 1) {
                         m2.remove(allTags[l]);

                    } else {
                        m2.put(allTags[l],  m2.get(allTags[l]) - 1);
                    }
                   }

                    l ++;
               }

            }

        }
        if(ans == allTags.length) {
            return -1;
        }

        return ans;


    }
}

用的模板,注意最后条件 如果d=n+1的话 要返回-1。因为初始化d=n+1.

如果初始化时 float("inf"),就比较d == float("inf") return -1

import collections


class Solution:
    """
    @param tagList: The tag list.
    @param allTags: All the tags.
    @return: Return the answer
    """
    def getMinimumStringArray(self, tagList, allTags):
        # Write your code here
        map = collections.defaultdict(int)
        for i in tagList:
            map[i] += 1
        start=end=0
        counter=len(tagList)
        n = len(allTags)
        d=n+1
        while end<n:
            if map[allTags[end]]>0:
                counter -=1
            map[allTags[end]] -= 1
            end +=1
            while counter == 0:
                d = min(d,end-start)

                if map[allTags[start]] == 0:
                    counter += 1
                map[allTags[start]] += 1
                start += 1
        if d == n+1:
            return -1

        return d

Last updated