标签:leetcode
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
For example,
S = "ADOBECODEBANC"
T = "ABC"
Minimum window is "BANC"
.
Note:
If there is no such window in S that covers all characters in T, return the emtpy string ""
.
If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
思路:此题就是求解最小包含T的子串,最优解法是O(n)时间复杂度。思想是用两个128的int数组,分别保存s和t的字符的个数。
start,end首尾双指针,对s进行遍历,end++时,将s.charAt(end)对应的int数组值+1,start++时,将s.charAt(start)对应的int数组值-1.
当找到满足符合要求的end时,与最小的长度比较,比最小的长度还小,则交换数值,否则,start跳转合适的位置,同时s.charAt(start)对应的数组-1.
具体代码如下:
public class Solution { public String minWindow(String s, String t) { char[] cS = s.toCharArray();//转换成数组,以后操作更方便快捷 char[] cT = t.toCharArray(); if(cS.length ==0 || cT.length==0){ return "";//如果有为空,返回空 } //定义匹配的字符串最小匹配长度 int len = Integer.MAX_VALUE; int[] sA = new int[128];//存储s字符串中字符的个数 int[] tA = new int[128];//存储t字符个数 //将比较的字符串记录在数组中 for(int i = 0; i < cT.length; i++){ tA[t.charAt(i)]++; } int start = 0;//起始 int end = 0;//结束 int s0 = 0;//保存最小长度的起始值 int e0 = 0;//保存最小长度的结束值 int it = 0;//t字符串的起始 boolean isEndAdd = true;//end指针时候变动 //遍历 while(end < cS.length){ //System.out.println("start:" + start); if(isEndAdd)//只有end+1才添加 sA[cS[end]]++; if(end - start >= cT.length-1){//只有字符长度大于t的长度才比较 while(it < cT.length){//t字符的当前位置 if(tA[cT[it]] <= sA[cT[it]]){//如果一个字符个数相等了,比较下一个字符 it++; }else{ break;//如果不相等,直接结束循环 } } if(it == cT.length){//符合要求 if(len > end - start + 1){//如果值小于当前 s0 = start;//更新起始值 e0 = end+1; len = e0 - s0;//更新长度 }else{ //如果len长度比当前长度小,则当前起始直接到len宽度的起始,也即strat = end - len; for(;start <= end - len;start++){ sA[cS[start]]--;//同时将sA数组的字符数-1 } } sA[cS[start]]--; start++;//要比当前长度小1 isEndAdd = false; it = 0;//后面重新匹配 }else{ isEndAdd = true; end++; } }else{ isEndAdd = true; end++; } } return s.substring(s0,e0); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
leetCode 76.Minimum Window Substring(最小窗口子串) 解题思路和方法
标签:leetcode
原文地址:http://blog.csdn.net/xygy8860/article/details/46955889