领扣LintCode问题答案-32. 最小子串覆盖

领扣LintCode问题答案-32. 最小子串覆盖

目录

  • 32. 最小子串覆盖
  • 鸣谢

32. 最小子串覆盖

给定两个字符串 source 和 target. 求 source 中最短的包含 target 中每一个字符的子串.

如果没有答案, 返回 “”.
保证答案是唯一的.
target 可能包含重复的字符, 而你的答案需要包含至少相同数量的该字符.

样例 1:

输入: source = “abc”, target = “ac”
输出: “abc”

样例 2:

输入: source = “adobecodebanc”, target = “abc”
输出: “banc”
解释: “banc” 是 source 的包含 target 的每一个字符的最短的子串.

样例 3:

输入: source = “abc”, target = “aa”
输出: “”
解释: 没有子串包含两个 ‘a’.

public class Solution {
     
	/**
	 * @param source  : A string
	 * @param target: A string
	 * @return: A string denote the minimum window, return "" if there is no such a string
	 */
	public String minWindow(String source, String target) {
     
		// write your code here
		if (target.length() > source.length()
				|| target.length() == 0) {
     
			return "";
		}
		int[] tMap = new int[256];
		for (char c : target.toCharArray()) {
     
			tMap[c]++;
		}
		int[] sMap  = new int[256];
		int   count = target.length();

		int minStartIndex = -1;
		int minEndIndex   = source.length();
		int j             = 0;
		for (int i = 0; i <= source.length() - target.length(); i++) {
     
			while (j < source.length()
					&& count > 0) {
     
				char ec = source.charAt(j);
				if (sMap[ec] < tMap[ec]) {
     
					count--;
				}
				sMap[ec]++;
				j++;
			}
			if (count == 0) {
     
				if (j - i - 1 < minEndIndex - minStartIndex) {
     
					minStartIndex = i;
					minEndIndex = j - 1;
				}
			}
			char sc = source.charAt(i);
			sMap[sc]--;
			if (sMap[sc] < tMap[sc]) {
     
				count++;
			}
		}

		return minStartIndex == -1 ? "" : source.substring(minStartIndex, minEndIndex + 1);
	}
}

原题链接点这里

鸣谢

非常感谢你愿意花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,请指正。
欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。

你可能感兴趣的:(算法,算法)