Find substring with K-1 distinct characters

参考 Find substring with K distinct characters

Find substring with K distinct characters(http://www.cnblogs.com/pegasus923/p/8444653.html)

Given a string and number K, find the substrings of size K with K-1 distinct characters. If no, output empty list. Remember to emit the duplicate substrings, i.e. if the substring repeated twice, only output once.

  • 字符串中等题。Sliding window algorithm + Hash。此题跟上题的区别在于,子串中有一个重复字符。
  • 思路还是跟上题一样,只是需要把对count的判断条件改成dupCount。当窗口size为K时,如果重复字符只有一个的话,则为结果集。对dupCount操作的判断条件,也需要改为>0, >1。
 1 //
 2 //  main.cpp
 3 //  LeetCode
 4 //
 5 //  Created by Hao on 2017/3/16.
 6 //  Copyright © 2017年 Hao. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <vector>
11 #include <unordered_map>
12 using namespace std;
13 
14 class Solution {
15 public:
16     vector<string> subStringK1Dist(string S, int K) {
17         vector<string> vResult;
18         
19         // corner case
20         if (S.empty()) return vResult;
21         
22         unordered_map<char, int>    hash;
23         
24         // window start/end pointer, hit count
25         int left = 0, right = 0, dupCount = 0;
26         
27         while (right < S.size()) {
28             if (hash[S.at(right)] > 0) // hit the condition dup char
29                 ++ dupCount;
30             
31             ++ hash[S.at(right)]; // count the occurrence
32             
33             ++ right; // move window end pointer rightward
34             
35             // window size reaches K
36             if (right - left == K) {
37                 if (1 == dupCount) { // find 1 dup char
38                     if (find(vResult.begin(), vResult.end(), S.substr(left, K)) == vResult.end()) // using STL find() to avoid dup
39                         vResult.push_back(S.substr(left, K));
40                 }
41                 
42                 // dupCount is only increased when hash[i] > 0, so only hash[i] > 1 means that dupCount was increased.
43                 if (hash[S.at(left)] > 1)
44                     -- dupCount;
45                 
46                 -- hash[S.at(left)]; // decrease to restore occurrence
47                 
48                 ++ left; // move window start pointer rightward
49             }
50         }
51         
52         return vResult;
53     }
54 };
55 
56 int main(int argc, char* argv[])
57 {
58     Solution    testSolution;
59     
60     vector<string>  sInputs = {"aaabbcccc","awaglknagawunagwkwagl", "abccdef", "", "aaaaaaa", "ababab"};
61     vector<int>     iInputs = {4, 4, 2, 1, 2, 3};
62     vector<string>  result;
63     
64     /*
65      {abbc }
66      {awag naga agaw gwkw wkwa }
67      {cc }
68      {}
69      {aa }
70      {aba bab }
71      */
72     for (auto i = 0; i < sInputs.size(); ++ i) {
73         result = testSolution.subStringK1Dist(sInputs[i], iInputs[i]);
74         
75         cout << "{";
76         for (auto it : result)
77             cout << it << " ";
78         cout << "}" << endl;
79     }
80     
81     return 0;
82 }
View Code

 

posted on 2018-02-12 16:50  浩然119  阅读(654)  评论(0编辑  收藏  举报