Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40210
  • 博文数量: 37
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 372
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-12 23:27
文章分类

全部博文(37)

文章存档

2014年(5)

2013年(32)

我的朋友

分类: C/C++

2014-01-26 12:00:20

设置两个指针。后指针往后扫S到包含T所有字符即停止,然后前指针往后收缩找到最小窗口。



点击(此处)折叠或打开

  1. class Solution {
  2. public:
  3.     string minWindow(string S, string T) {
  4.         if(S.empty()||T.empty()||S.length()<T.length()) return "";
  5.         vector<int> cnt1('z'-'A'+1,0);
  6.         vector<int> cnt2('z'-'A'+1,0);
  7.         int cnt=0;
  8.         int pos=0;
  9.         int minlen=S.length();
  10.         int minpos=-1;
  11.         for(int i=0;i<T.length();i++)
  12.             cnt1[T[i]-'A']++;
  13.     
  14.         for(int i=0;i<S.length();i++)
  15.         {
  16.             if(cnt1[S[i]-'A'])
  17.             {
  18.                 cnt2[S[i]-'A']++;
  19.                 if(cnt1[S[i]-'A']>=cnt2[S[i]-'A'])
  20.                     cnt++;
  21.             }
  22.             if(T.length()==cnt)
  23.             {
  24.                 while(pos<=i)
  25.                 {
  26.                     if(cnt1[S[pos]-'A'])
  27.                     {
  28.                         if(cnt1[S[pos]-'A']<cnt2[S[pos]-'A']) cnt2[S[pos]-'A']--;
  29.                         else break;
  30.                     }
  31.                     pos++;
  32.                 }
  33.                 if(i-pos+1<=minlen) minlen=i-pos+1,minpos=pos;
  34.             }
  35.         }
  36.         return -1!=minpos?S.substr(minpos,minlen):"";
  37.     }
  38. };

阅读(732) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~