32. 最小子串覆盖

描述

给定一个字符串 source 和一个目标字符串 target,在字符串 source 中找到包括所有目标字符串字母的子串。
如果在 source 中没有这样的子串,返回"",如果有多个这样的子串,返回起始位置最小的子串(长度最短的子串)。

说明

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

样例

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

挑战

要求时间复杂度为O(n)

思路

利用 hash 表来记录字符串中字母出现次数
当 target 中每个字母在 sourcehash 表中出现次数大于在 targethash 表中出现次数则认为满足包含条件

字符串ABCD 和子串 EF 检查子串是否在字符串中,如果用两个for循环暴力解法,最外层先遍历子串,子串每一个字母都在字符串中进行查找

代码

public class Solution {    
    int initTargetHash(int []targethash, String Target) {
        int targetnum =0 ;
        for (char ch : Target.toCharArray()) {
            targetnum++;
            targethash[ch]++;
        }
        return targetnum;
    }
    
    boolean valid(int[] sourcehash, int[] targethash) {
        for (int i = 0; i < 256; i++) {
            if (targethash[i] > sourcehash[i]) {   
                return false;
            }
        }
        return true;
    }
    
    public String minWindow(String Source, String Target) {
        int ans = Integer.MAX_VALUE;
        String minStr = "";
        
        int[] sourcehash = new int[256];
        int[] targethash = new int[256];
        
        initTargetHash(targethash, Target);
        // i j 分别是子串在字符串中的起始位置
        int j = 0, i = 0;
        for (i = 0; i < Source.length(); i++) {
            while (!valid(sourcehash, targethash) && j < Source.length()) {
                sourcehash[Source.charAt(j)]++;
                // j 位置的字母在 hash 表中次数加1后 j++
                j++;
            }
            if (valid(sourcehash, targethash)) {
                if (ans > j - i) {
                    ans = Math.min(ans, j - i);
                    // minStr不包含 j
                    minStr = Source.substring(i, j);
                }
            }
            sourcehash[Source.charAt(i)]--;
        }
        return minStr;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,270评论 19 139
  • 1)字符串操作strcpy(p, p1) 复制字符串strncpy(p, p1, n) 复制指定长度字符串strc...
    XDgbh阅读 10,072评论 0 10
  • 本文转自:http://www.cnblogs.com/lidabo/p/5225868.html 1)字符串操作...
    XiaohuiLI阅读 13,181评论 0 0
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,906评论 0 4
  • 七十二座峰七十二个梦 三十四年脑际风云中 变幻莫测 山谷沉寂 弥漫碧透凉意 活化一股山泉 明晃曲折成涧溪 翻唱三十...
    中午生阅读 2,839评论 0 0

友情链接更多精彩内容