567. 字符串的排列

 1 class Solution 
 2 {
 3 public:
 4     // 判断 s 中是否存在 t 的排列
 5     bool checkInclusion(string t, string s) 
 6     {
 7         unordered_map<char, int> need, window;
 8         for (char c : t) need[c]++;
 9 
10         int left = 0, right = 0;
11         int valid = 0;
12         while (right < s.size()) 
13         {
14             char c = s[right];
15             right++;
16             // 进行窗口内数据的一系列更新
17             if (need.count(c)) 
18             {
19                 window[c]++;
20                 if (window[c] == need[c])
21                     valid++;
22             }
23 
24             // 判断左侧窗口是否要收缩
25             if (right - left == t.size()) 
26             {
27                 // 在这里判断是否找到了合法的子串
28                 if (valid == need.size())
29                     return true;
30                 char d = s[left];
31                 left++;
32                 // 进行窗口内数据的一系列更新
33                 if (need.count(d)) 
34                 {
35                     if (window[d] == need[d])
36                         valid--;
37                     window[d]--;
38                 }
39             }
40         }
41         // 未找到符合条件的子串
42         return false;
43     }
44 };

 

posted @ 2020-04-25 11:02  Jinxiaobo0509  阅读(134)  评论(0)    收藏  举报