Level:

  Hard

题目描述:

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).

Example:

Input: S = "ADOBECODEBANC", T = "ABC"
Output: "BANC"

Note:

  • If there is no such window in S that covers all characters in T, return the empty string "".
  • If there is such window, you are guaranteed that there will always be only one unique minimum window in S.

思路分析:

知识点:滑动窗口

  关键点一:像这种找子串的可以使用滑动窗口Sliding Window来做。这个窗口由left和right来约束[left,right]这个闭区间,刚开始知识left=right=0,然后left不变,right不断增长,直到到达某个值,left和right一起增长,这样就实现了窗口的创建和向下滑动。

  关键点二:对于p中出现的字符以及次数需要记下来。可以使用一个数组ascaiiNums,长度为256,是因为ascaii一共只有256个,初始化的值表示角标对应的ascaii字符在p中出现的次数,那么没有出现过的就是0.之后如果s中出现过该字符,那么数组对应位置的值就减一。如果减之后的值大于等于0,就说明p中该字符出现了一次,这时p中未出现的字符数量count就减一。之所以要判断是>=0,是因为如果数组中原来的值是0(说明p中没有出现),那么减一后就成了负的,这种情况下p中剩下未出现的字符的count数值保持不变。如果count的值为0,说明p中的字符全出现了,找到一个符合条件的子串,left就是子串的首地址。之后要向右滑动窗口,移动的方法是left++,right++,更新p中未出现的字符个数count。

代码:

public class Solution{
public String minWindow(String s,String t){
if(s==null||t==null||s.length()==0||t.length()==0)
return null;
String res="";
int []map=new int [256];
int match=t.length();
int left=0; //窗口左端
for(int i=0;i<t.length();i++){
map[t.charAt(i)]++;
}
int minlen=Integer.MAX_VALUE;
for(int i=0;i<s.length();i++){//i充当窗口的右端
map[s.charAt(i)]--;
if(map[s.charAt(i)]>=0)
match--; //证明该字符在t中
if(match==0){
while(map[s.charAt(left)]<0){
map[s.charAt(left)]++;
left++; //这些字符都不存在与t中
}
if((i-left+1)<minlen){//更新最短子串
minlen=i-left+1;
res=s.substring(left,i+1);
}
match++; //寻找下一个包含t的串
map[s.charAt(left)]++;
left++;
}
}
return minlen==Integer.MAX_VALUE?"":res;
}
}

最新文章

  1. 关于UIView的方法animateWithDuration:animations:completion:的说明
  2. 数论 - Funny scales(SPOJ - SCALE)
  3. java去处重复输出
  4. iOS开发之网络编程--获取文件的MIMEType
  5. [转]oracle的ANYDATA数据类型
  6. GYM 100608G 记忆化搜索+概率 2014-2015 Winter Petrozavodsk Camp, Andrew Stankevich Contest 47 (ASC 47)
  7. mpvue中使用wxParse,解析a标签跳转问题
  8. emWin实现ATM机界面设计,含uCOS-III和FreeRTOS两个版本
  9. leecode第二百三十题(二叉搜索树中第K小的元素)
  10. hibernate主配置文件的配置
  11. wrk压测工具使用
  12. Kubernetes集群部署之一系统环境初始化
  13. java字节流复制文件
  14. Ubuntu下允许Root用户的操作 (图形界面登录、su切换……)
  15. express4.X 笔记
  16. 使用iTextSharp 解析html生成pdf,xmlworker不支持中文的解决办法
  17. 向linux服务器上传下载文件方式收集
  18. MonoBehaviour.OnValidate
  19. HRBUST1212 乘积最大 2017-03-06 15:47 59人阅读 评论(0) 收藏
  20. echarts-detail---散点图

热门文章

  1. union 横向组合
  2. flask之视图函数从前端接收数据的方法
  3. python的list拷贝
  4. Flask路由之重定向
  5. window10 安装 docker
  6. 【Swagger2】SpringBoot整合swagger2
  7. 2、投资之基金 - IT人思维之投资
  8. 字符串(一):char 数组
  9. 51nod 1205 流水线调度
  10. linux中awk 详解