# 最小覆盖子串

<p>给你一个字符串 <code>s</code> 、一个字符串 <code>t</code> 。返回 <code>s</code> 中涵盖 <code>t</code> 所有字符的最小子串。如果 <code>s</code> 中不存在涵盖 <code>t</code> 所有字符的子串，则返回空字符串 <code>""</code> 。</p><p><strong>注意：</strong>如果 <code>s</code> 中存在这样的子串，我们保证它是唯一的答案。</p><p> </p><p><strong>示例 1：</strong></p><pre><strong>输入：</strong>s = "ADOBECODEBANC", t = "ABC"<strong><br />输出：</strong>"BANC"</pre><p><strong>示例 2：</strong></p><pre><strong>输入：</strong>s = "a", t = "a"<strong><br />输出：</strong>"a"</pre><p> </p><p><strong>提示：</strong></p><ul>	<li><code>1 <= s.length, t.length <= 10<sup>5</sup></code></li>	<li><code>s</code> 和 <code>t</code> 由英文字母组成</li></ul><p> </p><strong>进阶：</strong>你能设计一个在 <code>o(n)</code> 时间内解决此问题的算法吗？

以下程序实现了这一功能，请你填补空白处内容：

```java
public class Min_Win_Sub {
	public String minWindow(String s, String t) {
		int[] ta = new int[128];
		int[] sa = new int[128];
		int min = Integer.MAX_VALUE;
		String minwin = "";
		for (int i = 0; i < t.length(); i++) {
			ta[t.charAt(i)]++;
		}
		int count = 0;
		int end = 0;
		int start = 0;
		while (end < s.length()) {
			if (ta[s.charAt(end)] != 0) {
				if (sa[s.charAt(end)] < ta[s.charAt(end)]) {
					count++;
				}
				sa[s.charAt(end)]++;
			}
			if (count == t.length()) {
				_________________;
				if (end - start + 1 < min) {
					minwin = s.substring(start, end + 1);
					min = end - start + 1;
				}
			}
			end++;
		}
		return minwin;
	}

}
```

## template

```java
public class Min_Win_Sub {
	public String minWindow(String s, String t) {
		int[] ta = new int[128];
		int[] sa = new int[128];
		int min = Integer.MAX_VALUE;
		String minwin = "";
		for (int i = 0; i < t.length(); i++) {
			ta[t.charAt(i)]++;
		}
		int count = 0;
		int end = 0;
		int start = 0;
		while (end < s.length()) {
			if (ta[s.charAt(end)] != 0) {
				if (sa[s.charAt(end)] < ta[s.charAt(end)]) {
					count++;
				}
				sa[s.charAt(end)]++;
			}
			if (count == t.length()) {
				while (ta[s.charAt(start)] == 0 || sa[s.charAt(start)] > ta[s.charAt(start)]) {
					if (sa[s.charAt(start)] > ta[s.charAt(start)]) {
						sa[s.charAt(start)]--;
					}
					start++;
				}
				if (end - start + 1 < min) {
					minwin = s.substring(start, end + 1);
					min = end - start + 1;
				}
			}
			end++;
		}
		return minwin;
	}

}
```

## 答案

```java
while (ta[s.charAt(start)] == 0 || sa[s.charAt(start)] > ta[s.charAt(start)]) {
	if (sa[s.charAt(start)] > ta[s.charAt(start)]) {
		sa[s.charAt(start)]--;
	}
	start++;
}
```

## 选项

### A

```java
while (ta[s.charAt(start)] == 0 || sa[s.charAt(start)] > ta[s.charAt(start)]) {
	if (sa[s.charAt(start)] < ta[s.charAt(start)]) {
		sa[s.charAt(start)]--;
	}
	start++;
}
```

### B

```java
while (ta[s.charAt(start)] == 0 || sa[s.charAt(start)] > ta[s.charAt(start)]) {
	if (sa[s.charAt(start)] <= ta[s.charAt(start)]) {
		sa[s.charAt(start)]--;
	}
	start++;
}
```

### C

```java
while (ta[s.charAt(start)] == 0 || sa[s.charAt(start)] >= ta[s.charAt(start)]) {
	if (sa[s.charAt(start)] <= ta[s.charAt(start)]) {
		sa[s.charAt(start)]--;
	}
	start++;
}
```