Štejte substring s k različnimi znaki

Glede na niz, sestavljen iz le malih črk angleščine in celoštevilčnega k šteje skupno število podstavkov (ne nujno ločenih) S, ki vsebujejo natančno K različne znake.
Opomba:

  • SubString je sosednje zaporedje znakov znotraj niza.
  • Subtringe, ki so enake, vendar se pojavljajo na različnih položajih, naj se vsaka šteje ločeno.

Primeri:  

Vnos: S = 'ABC' K = 2
Izhod: 2
Pojasnilo: Možne podstrele so ['ab' 'bc']

Vnos: s = 'aba' k = 2
Izhod: 3
Pojasnilo: Možne podstrele so ['ab' 'ba' 'aba']

Vnos: s = 'aa' k = 1
Izhod: 3
Pojasnilo: Možni subsinti so ['a' 'a' 'aa']

Tabela vsebine

[Naivni pristop] Preverjanje vseh podstreškov - o (n^2) čas in o (1) prostor

Ideja je, da preverite vse možne podlage tako, da ponovimo skozi vse možne začetne položaje (i) in končne položaje (j) v nizu. Za vsako podvrst vzdržujte logični niz, ki sledi različnim znakom in števec za število različnih znakov. Ko širi podstavek od leve proti desni, posodobi izrazito število znakov, tako da preveri, ali je bil vsak nov znak viden že prej. Kadar koli se število različnih znakov natančno ujema z dano k, poveča število odgovorov.

C++
   #include          #include         using     namespace     std  ;   int     countSubstr  (  string     &  s       int     k  )     {      int     n     =     s  .  length  ();      int     ans     =     0  ;          for     (  int     i  =  0  ;     i   <  n  ;     i  ++  )     {          // array to check if a character       // is present in substring i..j      vector   <  bool  >     map  (  26       0  );      int     distinctCnt     =     0  ;          for     (  int     j  =  i  ;     j   <  n  ;     j  ++  )     {          // if new character is present      // increment distinct count.      if     (  map  [  s  [  j  ]     -     'a'  ]     ==     false  )     {      map  [  s  [  j  ]     -     'a'  ]     =     true  ;      distinctCnt  ++  ;      }          // if distinct count is equal to k.      if     (  distinctCnt     ==     k  )     ans  ++  ;      }      }          return     ans  ;   }   int     main  ()     {      string     s     =     'abc'  ;      int     k     =     2  ;          cout      < <     countSubstr  (  s       k  );      return     0  ;   }   
Java
   class   GfG     {      static     int     countSubstr  (  String     s       int     k  )     {      int     n     =     s  .  length  ();      int     ans     =     0  ;      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      // array to check if a character       // is present in substring i..j      boolean  []     map     =     new     boolean  [  26  ]  ;      int     distinctCnt     =     0  ;      for     (  int     j     =     i  ;     j      <     n  ;     j  ++  )     {      // if new character is present      // increment distinct count.      if     (  !  map  [  s  .  charAt  (  j  )     -     'a'  ]  )     {      map  [  s  .  charAt  (  j  )     -     'a'  ]     =     true  ;      distinctCnt  ++  ;      }      // if distinct count is equal to k.      if     (  distinctCnt     ==     k  )     ans  ++  ;      }      }      return     ans  ;      }      public     static     void     main  (  String  []     args  )     {      String     s     =     'abc'  ;      int     k     =     2  ;      System  .  out  .  println  (  countSubstr  (  s       k  ));      }   }   
Python
   def   countSubstr  (  s     k  ):   n   =   len  (  s  )   ans   =   0   for   i   in   range  (  n  ):   # array to check if a character    # is present in substring i..j   map   =   [  False  ]   *   26   distinctCnt   =   0   for   j   in   range  (  i     n  ):   # if new character is present   # increment distinct count.   if   not   map  [  ord  (  s  [  j  ])   -   ord  (  'a'  )]:   map  [  ord  (  s  [  j  ])   -   ord  (  'a'  )]   =   True   distinctCnt   +=   1   # if distinct count is equal to k.   if   distinctCnt   ==   k  :   ans   +=   1   return   ans   if   __name__   ==   '__main__'  :   s   =   'abc'   k   =   2   print  (  countSubstr  (  s     k  ))   
C#
   using     System  ;   class     GfG     {      static     int     countSubstr  (  string     s       int     k  )     {      int     n     =     s  .  Length  ;      int     ans     =     0  ;      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      // array to check if a character       // is present in substring i..j      bool  []     map     =     new     bool  [  26  ];      int     distinctCnt     =     0  ;      for     (  int     j     =     i  ;     j      <     n  ;     j  ++  )     {      // if new character is present      // increment distinct count.      if     (  !  map  [  s  [  j  ]     -     'a'  ])     {      map  [  s  [  j  ]     -     'a'  ]     =     true  ;      distinctCnt  ++  ;      }      // if distinct count is equal to k.      if     (  distinctCnt     ==     k  )     ans  ++  ;      }      }      return     ans  ;      }      static     void     Main  ()     {      string     s     =     'abc'  ;      int     k     =     2  ;      Console  .  WriteLine  (  countSubstr  (  s       k  ));      }   }   
JavaScript
   function     countSubstr  (  s       k  )     {      let     n     =     s  .  length  ;      let     ans     =     0  ;      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      // array to check if a character       // is present in substring i..j      let     map     =     new     Array  (  26  ).  fill  (  false  );      let     distinctCnt     =     0  ;      for     (  let     j     =     i  ;     j      <     n  ;     j  ++  )     {      // if new character is present      // increment distinct count.      if     (  !  map  [  s  .  charCodeAt  (  j  )     -     'a'  .  charCodeAt  (  0  )])     {      map  [  s  .  charCodeAt  (  j  )     -     'a'  .  charCodeAt  (  0  )]     =     true  ;      distinctCnt  ++  ;      }      // if distinct count is equal to k.      if     (  distinctCnt     ===     k  )     ans  ++  ;      }      }      return     ans  ;   }   // Driver Code   let     s     =     'abc'  ;   let     k     =     2  ;   console  .  log  (  countSubstr  (  s       k  ));   

Izhod
2 

[Učinkovit pristop] Uporaba metode drsnega okna - o (n) čas in o (1) prostor

Ideja je uporaba drsno okno Tehnika za učinkovito štetje podstavkov z največ k različnimi znaki in nato odštevanje števila podstavkov z največ K-1 različnimi znaki, da dobite število podstavkov s točno K različnimi znaki.

Korak za korakom Izvedba:

  • Za sledenje frekvenc znakov uporabite drsno okno z matriko velikosti 26.
  • Razširite okno na desno dodajanje znakov.
  • Zmanjšajte okno z leve, ko različni znaki presežejo k.
  • V oknu štejte vse veljavne podstranitve.
  • Odštejte subtrine z različnimi znaki K-1 od K različnih znakov.
C++
   #include          #include         using     namespace     std  ;   // function which finds the number of    // substrings with atmost k Distinct   // characters.   int     count  (  string     &  s       int     k  )     {      int     n     =     s  .  length  ();      int     ans     =     0  ;          // use sliding window technique      vector   <  int  >     freq  (  26       0  );      int     distinctCnt     =     0  ;      int     i     =     0  ;          for     (  int     j     =     0  ;     j      <     n  ;     j  ++  )     {          // expand window and add character      freq  [  s  [  j  ]     -     'a'  ]  ++  ;      if     (  freq  [  s  [  j  ]     -     'a'  ]     ==     1  )     distinctCnt  ++  ;          // shrink window if distinct characters exceed k      while     (  distinctCnt     >     k  )     {      freq  [  s  [  i  ]     -     'a'  ]  --  ;      if     (  freq  [  s  [  i  ]     -     'a'  ]     ==     0  )     distinctCnt  --  ;      i  ++  ;      }          // add number of valid substrings ending at j      ans     +=     j     -     i     +     1  ;      }          return     ans  ;   }   // function to find the number of substrings   // with exactly k Distinct characters.   int     countSubstr  (  string     &  s       int     k  )     {      int     n     =     s  .  length  ();      int     ans     =     0  ;          // subtract substrings with at most       // k-1 distinct characters from substrings      // with at most k distinct characters      ans     =     count  (  s       k  )     -     count  (  s       k  -1  );          return     ans  ;   }   int     main  ()     {      string     s     =     'abc'  ;      int     k     =     2  ;      cout      < <     countSubstr  (  s       k  );      return     0  ;   }   
Java
   class   GfG     {      // function which finds the number of       // substrings with atmost k Distinct      // characters.      static     int     count  (  String     s       int     k  )     {      int     n     =     s  .  length  ();      int     ans     =     0  ;      // use sliding window technique      int  []     freq     =     new     int  [  26  ]  ;      int     distinctCnt     =     0  ;      int     i     =     0  ;      for     (  int     j     =     0  ;     j      <     n  ;     j  ++  )     {      // expand window and add character      freq  [  s  .  charAt  (  j  )     -     'a'  ]++  ;      if     (  freq  [  s  .  charAt  (  j  )     -     'a'  ]     ==     1  )     distinctCnt  ++  ;      // shrink window if distinct characters exceed k      while     (  distinctCnt     >     k  )     {      freq  [  s  .  charAt  (  i  )     -     'a'  ]--  ;      if     (  freq  [  s  .  charAt  (  i  )     -     'a'  ]     ==     0  )     distinctCnt  --  ;      i  ++  ;      }      // add number of valid substrings ending at j      ans     +=     j     -     i     +     1  ;      }      return     ans  ;      }      // function to find the number of substrings      // with exactly k Distinct characters.      static     int     countSubstr  (  String     s       int     k  )     {      int     n     =     s  .  length  ();      int     ans     =     0  ;      // Subtract substrings with at most       // k-1 distinct characters from substrings      // with at most k distinct characters      ans     =     count  (  s       k  )     -     count  (  s       k     -     1  );      return     ans  ;      }      public     static     void     main  (  String  []     args  )     {      String     s     =     'abc'  ;      int     k     =     2  ;      System  .  out  .  println  (  countSubstr  (  s       k  ));      }   }   
Python
   # function which finds the number of    # substrings with atmost k Distinct   # characters.   def   count  (  s     k  ):   n   =   len  (  s  )   ans   =   0   # ese sliding window technique   freq   =   [  0  ]   *   26   distinctCnt   =   0   i   =   0   for   j   in   range  (  n  ):   # expand window and add character   freq  [  ord  (  s  [  j  ])   -   ord  (  'a'  )]   +=   1   if   freq  [  ord  (  s  [  j  ])   -   ord  (  'a'  )]   ==   1  :   distinctCnt   +=   1   # shrink window if distinct characters exceed k   while   distinctCnt   >   k  :   freq  [  ord  (  s  [  i  ])   -   ord  (  'a'  )]   -=   1   if   freq  [  ord  (  s  [  i  ])   -   ord  (  'a'  )]   ==   0  :   distinctCnt   -=   1   i   +=   1   # add number of valid substrings ending at j   ans   +=   j   -   i   +   1   return   ans   # function to find the number of substrings   # with exactly k Distinct characters.   def   countSubstr  (  s     k  ):   n   =   len  (  s  )   ans   =   0   # subtract substrings with at most    # k-1 distinct characters from substrings   # with at most k distinct characters   ans   =   count  (  s     k  )   -   count  (  s     k   -   1  )   return   ans   if   __name__   ==   '__main__'  :   s   =   'abc'   k   =   2   print  (  countSubstr  (  s     k  ))   
C#
   using     System  ;   class     GfG     {      // function which finds the number of       // substrings with atmost k Distinct      // characters.      static     int     count  (  string     s       int     k  )     {      int     n     =     s  .  Length  ;      int     ans     =     0  ;      // use sliding window technique      int  []     freq     =     new     int  [  26  ];      int     distinctCnt     =     0  ;      int     i     =     0  ;      for     (  int     j     =     0  ;     j      <     n  ;     j  ++  )     {      // expand window and add character      freq  [  s  [  j  ]     -     'a'  ]  ++  ;      if     (  freq  [  s  [  j  ]     -     'a'  ]     ==     1  )     distinctCnt  ++  ;      // shrink window if distinct characters exceed k      while     (  distinctCnt     >     k  )     {      freq  [  s  [  i  ]     -     'a'  ]  --  ;      if     (  freq  [  s  [  i  ]     -     'a'  ]     ==     0  )     distinctCnt  --  ;      i  ++  ;      }      // add number of valid substrings ending at j      ans     +=     j     -     i     +     1  ;      }      return     ans  ;      }      // function to find the number of substrings      // with exactly k Distinct characters.      static     int     countSubstr  (  string     s       int     k  )     {      int     n     =     s  .  Length  ;      int     ans     =     0  ;      // subtract substrings with at most       // k-1 distinct characters from substrings      // with at most k distinct characters      ans     =     count  (  s       k  )     -     count  (  s       k     -     1  );      return     ans  ;      }      static     void     Main  ()     {      string     s     =     'abc'  ;      int     k     =     2  ;      Console  .  WriteLine  (  countSubstr  (  s       k  ));      }   }   
JavaScript
   // function which finds the number of    // substrings with atmost k Distinct   // characters.   function     count  (  s       k  )     {      let     n     =     s  .  length  ;      let     ans     =     0  ;      // use sliding window technique      let     freq     =     new     Array  (  26  ).  fill  (  0  );      let     distinctCnt     =     0  ;      let     i     =     0  ;      for     (  let     j     =     0  ;     j      <     n  ;     j  ++  )     {      // expand window and add character      freq  [  s  .  charCodeAt  (  j  )     -     'a'  .  charCodeAt  (  0  )]  ++  ;      if     (  freq  [  s  .  charCodeAt  (  j  )     -     'a'  .  charCodeAt  (  0  )]     ===     1  )      distinctCnt  ++  ;      // shrink window if distinct characters exceed k      while     (  distinctCnt     >     k  )     {      freq  [  s  .  charCodeAt  (  i  )     -     'a'  .  charCodeAt  (  0  )]  --  ;      if     (  freq  [  s  .  charCodeAt  (  i  )     -     'a'  .  charCodeAt  (  0  )]     ===     0  )      distinctCnt  --  ;      i  ++  ;      }      // add number of valid substrings ending at j      ans     +=     j     -     i     +     1  ;      }      return     ans  ;   }   // sunction to find the number of substrings   // with exactly k Distinct characters.   function     countSubstr  (  s       k  )     {      let     n     =     s  .  length  ;      let     ans     =     0  ;      // subtract substrings with at most       // k-1 distinct characters from substrings      // with at most k distinct characters      ans     =     count  (  s       k  )     -     count  (  s       k     -     1  );      return     ans  ;   }   // Driver Code   let     s     =     'abc'  ;   let     k     =     2  ;   console  .  log  (  countSubstr  (  s       k  ));   

Izhod
2 

Morda Vam Bo Všeč