博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 76. Minimum Window Substring
阅读量:6542 次
发布时间:2019-06-24

本文共 2585 字,大约阅读时间需要 8 分钟。

76. Minimum Window Substring

 
QuestionEditorial Solution
 
 
  • Total Accepted: 65455
  • Total Submissions: 297766
  • Difficulty: 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).

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 empty string "".

If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.

 

 to see which companies asked this question

Hide Tags
 
  
Show Similar Problems
 
 
题解:
调试了好久,终于做出来了。
题解懒得打字了,转一发:
 

和及类似的思路,使用l和r两个指针维护子串,用Hash表记录T字串中出现的字符。S中,每次循环r右移1位,然后判断r右移之后所指向的字符是否在Hash表中出现过:如果出现过,则表示在T中。此时通过计数器cnt判断T中字符是否都出现过,如果是,则记录l和r之间子串长度,并与最短长度比较。然后逐步右移l并在Hash表中删除l指向的字符直到计数器cnt小于T中字符数量。

注意一下,由于T中同一字符的数量可能减到负值,因此需要2重判断:先判断是否出现此字符,在判断此字符出现的具体数量。

时间复杂度:O(l1+l2)(l1和l2分别为字符串S和T的长度)

空间复杂度:O(l2)

 

注意:

string的子串: string substr(int pos = 0,int n = npos) const;//返回pos开始的n个字符组成的字符串

 

 

1 class Solution { 2 public: 3     string minWindow(string s, string t) { 4         string ans = ""; 5         int mi = INT_MAX; 6         int szs = s.size(); 7         int szt = t.size(); 8         int i,j; 9         int count[200];10         int have[200];11         memset(count,0,sizeof(count));12         memset(have,0,sizeof(have));13         for(i = 0;i < szt;i++){14             count[ t[i] - 'A' ]++;15         }16         int now = 0;17         for(i = 0,j = 0;j < szs;j++){18             int tm = s[j] - 'A';19             have[tm]++;20             if(count[tm] == 0){21                 continue;22             }23             else{24                 if(have[tm] <= count[tm])25                     now++;26             }27             if(now >= szt){28                 while(i <= j){29                     int ltm = s[i] - 'A';30                     if(count[ltm] == 0){31                         i++;32                         have[ltm]--;continue;33                     }34                     else{35                         if(have[ltm] > count[ltm]){36                             i++;37                             have[ltm]--;38                         }39                         else{40                             break;41                         }42                     }43                 }44                 if(j - i + 1 < mi){45                     mi = j - i + 1;46                     ans = s.substr(i,j - i + 1);47                 }48             }49         }50         return ans;51     }52 };

 

转载于:https://www.cnblogs.com/njczy2010/p/5706370.html

你可能感兴趣的文章
cucumber-api安装与试用
查看>>
android studio 导入主题设置,代码风格(附带eclipse 主题代码样式)
查看>>
markdown 简单教程
查看>>
二叉树1
查看>>
【leetcode】402. Remove K Digits
查看>>
RESTful API 设计最佳实践
查看>>
用于构建 RESTful Web 服务的多层架构
查看>>
转载C#加密方法
查看>>
eclipse中类和方法添加作者日期说明
查看>>
Python 精要参考(第二版) 第二章 语法及代码约定
查看>>
新学期的合作
查看>>
PHP之数组学习
查看>>
PHP判断远程文件是否存在
查看>>
JS 转义&反转义 HTML标签、特殊字符
查看>>
KVC集合操作符
查看>>
[转载]ext4文件系统的delalloc选项造成单次写延迟增加的分析
查看>>
Entity Framework 小知识(二)
查看>>
Oracle 18c新特性详解:In-Memory 专题
查看>>
爬虫到来?
查看>>
WPF RoadMap
查看>>