32. 最小子串覆蓋

描述

給定一個(gè)字符串 source 和一個(gè)目標(biāo)字符串 target,在字符串 source 中找到包括所有目標(biāo)字符串字母的子串。
如果在 source 中沒有這樣的子串,返回"",如果有多個(gè)這樣的子串,返回起始位置最小的子串(長(zhǎng)度最短的子串)。

說明

在答案的子串中的字母在目標(biāo)字符串中是否需要具有相同的順序?
——不需要。

樣例

給出source ="ADOBECODEBANC",target ="ABC" 滿足要求的解 "BANC"

挑戰(zhàn)

要求時(shí)間復(fù)雜度為O(n)

思路

利用 hash 表來(lái)記錄字符串中字母出現(xiàn)次數(shù)
當(dāng) target 中每個(gè)字母在 sourcehash 表中出現(xiàn)次數(shù)大于在 targethash 表中出現(xiàn)次數(shù)則認(rèn)為滿足包含條件

字符串ABCD 和子串 EF 檢查子串是否在字符串中,如果用兩個(gè)for循環(huán)暴力解法,最外層先遍歷子串,子串每一個(gè)字母都在字符串中進(jìn)行查找

代碼

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 表中次數(shù)加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;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 1)字符串操作strcpy(p, p1) 復(fù)制字符串strncpy(p, p1, n) 復(fù)制指定長(zhǎng)度字符串strc...
    XDgbh閱讀 4,733評(píng)論 0 11
  • 本文轉(zhuǎn)自:http://www.cnblogs.com/lidabo/p/5225868.html 1)字符串操作...
    XiaohuiLI閱讀 9,681評(píng)論 0 0
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,663評(píng)論 0 4
  • 七十二座峰七十二個(gè)夢(mèng) 三十四年腦際風(fēng)云中 變幻莫測(cè) 山谷沉寂 彌漫碧透涼意 活化一股山泉 明晃曲折成澗溪 翻唱三十...
    中午生閱讀 387評(píng)論 0 0

友情鏈接更多精彩內(nèi)容