Poista ylimääräiset tilat merkkijonosta

Annetaan merkkijono, joka sisältää monia peräkkäisiä tiloja, leikkaa kaikki tilat niin, että kaikkien sanojen tulisi sisältää Vain yksi tila niiden välillä. Muuntaminen tulisi tehdä paikalleen ja ratkaisujen tulisi käsitellä taka- ja johtavia tiloja ja poistettava myös edelliset tilat ennen yleisiä välimerkkejä, kuten täysi pysäytysraima ja kysymysmerkki.

Esimerkkejä: 

    Input:      
str = ' Hello Geeks . Welcome to GeeksforGeeks . ';
Output:
'Hello Geeks. Welcome to GeeksforGeeks.'
Input:
str = 'GeeksforGeeks';
Output:
'GeeksforGeeks'
(No change is needed)


Tämä ongelma on laajennus Poista tilat tietystä merkkijonosta

Menetelmä 1:

  • Ajatuksena on ylläpitää 2 osoitinta. Aluksi molemmat viittaavat taulukon alkuun.
  • Ensimmäinen osoitin seuraa seuraavaa sijaintia, joka on täytettävä lähtömerkkijono.
  • Toinen osoitin on lisätty lukemaan kaikki merkkijonon merkit yksi kerrallaan.
  • Löydettyään minkä tahansa ei-avaruushahmon hahmo kopioidaan ensimmäisen osoittimen sijaintiin ja sitten sekä ensimmäinen että toinen osoitin on edistetty.
  • Jos ei-avaruushahmo on täydellinen pysäytyskorva tai kysymysmerkki, poistamme myös ennen sitä edellisen tilan.
  • Kun löydät peräkkäiset avaruushahmot, yksi tila kopioidaan ensimmäisen osoittimen sijaintiin ja lepo jätetään huomiotta. Johtamis- ja takaosat hoidetaan erikseen liuoksessa.


Alla on yllä olevan idean C ++ -toteutus.

C++
   // C++ program to implement custom trim() function   #include          using     namespace     std  ;   // Function to in-place trim all spaces in the   // string such that all words should contain only   // a single space between them.   void     removeSpaces  (  string     &  str  )   {      // n is length of the original string      int     n     =     str  .  length  ();      // i points to next position to be filled in      // output string/ j points to next character      // in the original string      int     i     =     0       j     =     -1  ;      // flag that sets to true is space is found      bool     spaceFound     =     false  ;      // Handles leading spaces      while     (  ++  j      <     n     &&     str  [  j  ]     ==     ' '  );      // read all characters of original string      while     (  j      <     n  )      {      // if current characters is non-space      if     (  str  [  j  ]     !=     ' '  )      {      // remove preceding spaces before dot      // comma & question mark      if     ((  str  [  j  ]     ==     '.'     ||     str  [  j  ]     ==     ''     ||      str  [  j  ]     ==     '?'  )     &&     i     -     1     >=     0     &&      str  [  i     -     1  ]     ==     ' '  )      str  [  i     -     1  ]     =     str  [  j  ++  ];      else      // copy current character at index i      // and increment both i and j      str  [  i  ++  ]     =     str  [  j  ++  ];      // set space flag to false when any      // non-space character is found      spaceFound     =     false  ;      }      // if current character is a space      else     if     (  str  [  j  ++  ]     ==     ' '  )      {      // If space is encountered for the first      // time after a word put one space in the      // output and set space flag to true      if     (  !  spaceFound  )      {      str  [  i  ++  ]     =     ' '  ;      spaceFound     =     true  ;      }      }      }      // Remove trailing spaces      if     (  i      <=     1  )      str  .  erase  (  str  .  begin  ()     +     i       str  .  end  ());      else      str  .  erase  (  str  .  begin  ()     +     i     -     1       str  .  end  ());   }   // Driver Code   int     main  ()   {      string     str     =     ' Hello Geeks . Welcome to'      ' GeeksforGeeks . '  ;      removeSpaces  (  str  );      cout      < <     str  ;      return     0  ;   }   
Java
   class   Main  {      public     static     String     removeSpaces  (  String     s  )     {      int     n     =     s  .  length  ();      int     i     =     0       j     =     -  1  ;      boolean     spaceFound     =     false  ;          // Handles leading spaces      while     (  j      <     n     -     1     &&     s  .  charAt  (  j     +     1  )     ==     ' '  )     {      j  ++  ;      }          // read all characters of original string      while     (  j      <     n  )     {      // if current characters is non-space      if     (  s  .  charAt  (  j  )     !=     ' '  )     {      // remove preceding spaces before dot      // comma & question mark      if     ((  s  .  charAt  (  j  )     ==     '.'     ||     s  .  charAt  (  j  )     ==     ''     ||      s  .  charAt  (  j  )     ==     '?'  )     &&     i     -     1     >=     0     &&         s  .  charAt  (  i     -     1  )     ==     ' '  )     {      s     =     s  .  substring  (  0       i     -     1  )     +     s  .  charAt  (  j  )     +     s  .  substring  (  i  );      j  ++  ;      }     else     {      // copy current character at index i      // and increment both i and j      s     =     s  .  substring  (  0       i  )     +     s  .  charAt  (  j  )     +     s  .  substring  (  i     +     1  );      i  ++  ;      j  ++  ;      }          // set space flag to false when any      // non-space character is found      spaceFound     =     false  ;      }     else     if     (  s  .  charAt  (  j  )     ==     ' '  )     {      // If space is encountered for the first      // time after a word put one space in the      // output and set space flag to true      if     (  !  spaceFound  )     {      s     =     s  .  substring  (  0       i  )     +     ' '     +     s  .  substring  (  i     +     1  );      i  ++  ;      spaceFound     =     true  ;      }      j  ++  ;      }      }          // Remove trailing spaces      if     (  i      <=     1  )     {      s     =     s  .  substring  (  0       i  );      }     else     {      s     =     s  .  substring  (  0       i     -     1  );      }      return     s  ;   }   // Driver code   public     static     void     main  (  String  []     args  )     {      String     str     =     ' Hello Geeks . Welcome to'         +     ' GeeksforGeeks . '  ;      str     =     removeSpaces  (  str  );      System  .  out  .  println  (  str  );   }       }   
Python3
   # Python code for the above approach   def   removeSpaces  (  s  ):   # n is length of the original string   n   =   len  (  s  )   # i points to next position to be filled in   # output string/ j points to next character   # in the original string   i   =   0   j   =   -  1   # flag that sets to true is space is found   spaceFound   =   False   # Handles leading spaces   while   j    <   n   -   1   and   s  [  j   +   1  ]   ==   ' '  :   j   +=   1   # read all characters of original string   while   j    <   n  :   # if current characters is non-space   if   s  [  j  ]   !=   ' '  :   # remove preceding spaces before dot   # comma & question mark   if   ((  s  [  j  ]   ==   '.'   or   s  [  j  ]   ==   ''   or   s  [  j  ]   ==   '?'  )   and   i   -   1   >=   0   and   s  [  i   -   1  ]   ==   ' '  ):   s   =   s  [:  i   -   1  ]   +   s  [  j  ]   +   s  [  i  :]   j   +=   1   else  :   # copy current character at index i   # and increment both i and j   s   =   s  [:  i  ]   +   s  [  j  ]   +   s  [  i   +   1  :]   i   +=   1   j   +=   1   # set space flag to false when any   # non-space character is found   spaceFound   =   False   # if current character is a space   elif   s  [  j  ]   ==   ' '  :   # If space is encountered for the first   # time after a word put one space in the   # output and set space flag to true   if   not   spaceFound  :   s   =   s  [:  i  ]   +   ' '   +   s  [  i   +   1  :]   i   +=   1   spaceFound   =   True   j   +=   1   # Remove trailing spaces   if   i    <=   1  :   s   =   s  [:  i  ]   else  :   s   =   s  [:  i   -   1  ]   return   s   # Driver Code   str   =   ' Hello Geeks . Welcome to'    ' GeeksforGeeks . '   str   =   removeSpaces  (  str  )   print  (  str  )   # This code is contributed by adityasharmadev01   
C#
   // C# program to implement custom trim() function   using     System  ;   public     class     Gfg   {      public     static     void     Main  ()      {      string     str     =     ' Hello Geeks . Welcome to'     +      ' GeeksforGeeks . '  ;      removeSpaces  (  ref     str  );      Console  .  WriteLine  (  str  );      }      // Function to in-place trim all spaces in the      // string such that all words should contain only      // a single space between them.      public     static     void     removeSpaces  (  ref     string     str  )      {      // n is length of the original string      int     n     =     str  .  Length  ;      // i points to next position to be filled in      // output string/ j points to next character      // in the original string      int     i     =     0       j     =     -  1  ;      // flag that sets to true is space is found      bool     spaceFound     =     false  ;      // Handles leading spaces      while     (  ++  j      <     n     &&     str  [  j  ]     ==     ' '  );      // read all characters of original string      while     (  j      <     n  )      {      // if current characters is non-space      if     (  str  [  j  ]     !=     ' '  )      {      // remove preceding spaces before dot      // comma & question mark      if     ((  str  [  j  ]     ==     '.'     ||     str  [  j  ]     ==     ''     ||      str  [  j  ]     ==     '?'  )     &&     i     -     1     >=     0     &&      str  [  i     -     1  ]     ==     ' '  )      str     =     str  .  Remove  (  i     -     1       1  ).  Insert  (  i     -     1       str  [  j  ++  ].  ToString  ());      else      {      // copy current character at index i      // and increment both i and j      str     =     str  .  Remove  (  i       1  ).  Insert  (  i       str  [  j  ++  ].  ToString  ());      i  ++  ;      }      // set space flag to false when any      // non-space character is found      spaceFound     =     false  ;      }      // if current character is a space      else     if     (  str  [  j  ++  ]     ==     ' '  )      {      // If space is encountered for the first      // time after a word put one space in the      // output and set space flag to true      if     (  !  spaceFound  )      {      str     =     str  .  Remove  (  i       0  ).  Insert  (  i       ' '  );      i  ++  ;      spaceFound     =     true  ;      }      }      }      // Remove trailing spaces      if     (  i      <=     1  )      str     =     str  .  Remove  (  i       n     -     i  );      else      str     =     str  .  Remove  (  i     -     1       n     -     i     +     1  );      }   }   
JavaScript
   // JavaScript program to implement custom trim() function   // Function to in-place trim all spaces in the   // string such that all words should contain only   // a single space between them.   function     removeSpaces  (  str  )     {      // n is length of the original string      let     n     =     str  .  length  ;          // i points to next position to be filled in      // output string/ j points to next character      // in the original string      let     i     =     0       j     =     -  1  ;          // flag that sets to true is space is found      let     spaceFound     =     false  ;          // Handles leading spaces      while     (  ++  j      <     n     &&     str  [  j  ]     ==     ' '  );          // read all characters of original string      while     (  j      <     n  )     {      // if current characters is non-space      if     (  str  [  j  ]     !=     ' '  )     {      // remove preceding spaces before dot      // comma & question mark      if     ((  str  [  j  ]     ==     '.'     ||     str  [  j  ]     ==     ''     ||      str  [  j  ]     ==     '?'  )     &&     i     -     1     >=     0     &&      str  [  i     -     1  ]     ==     ' '  )      str     =     str  .  substr  (  0       i     -     1  )     +     str  [  j  ++  ]     +     str  .  substr  (  i  );          else      // copy current character at index i      // and increment both i and j      str     =     str  .  substr  (  0       i  ++  )     +     str  [  j  ++  ]     +     str  .  substr  (  i  );          // set space flag to false when any      // non-space character is found      spaceFound     =     false  ;      }      // if current character is a space      else     if     (  str  [  j  ++  ]     ==     ' '  )     {      // If space is encountered for the first      // time after a word put one space in the      // output and set space flag to true      if     (  !  spaceFound  )     {      str     =     str  .  substr  (  0       i  ++  )     +     ' '     +     str  .  substr  (  i  );      spaceFound     =     true  ;      }      }      }          // Remove trailing spaces      if     (  i      <=     1  )      str     =     str  .  substr  (  0       i  );      else      str     =     str  .  substr  (  0       i     -     1  );          return     str  ;   }   // Driver Code   let     str     =     ' Hello Geeks . Welcome to'   +     ' GeeksforGeeks . '  ;   str     =     removeSpaces  (  str  );   console  .  log  (  str  );   

Lähtö:  

 Hello Geeks. Welcome to GeeksforGeeks.   


Ajan monimutkaisuus yllä olevasta liuoksesta on O (n).
Aputila on O (1), kun muuntaminen tehdään paikallaan.

Menetelmä 2:
Toinen ratkaisu käyttämällä ennalta määritettyjä funktioita Pythonissa 3: 

C++
   #include          #include         int     main  ()     {      std  ::  string     input_string     =     ' Hello Geeks . Welcome  Do you love Geeks  Geeks ? '  ;      std  ::  string     output_string  ;      bool     space_flag     =     false  ;     // Flag to check if spaces have occurred      for     (  size_t     index     =     0  ;     index      <     input_string  .  length  ();     ++  index  )     {      if     (  input_string  [  index  ]     !=     ' '  )     {      if     (  space_flag  )     {      if     (  input_string  [  index  ]     ==     '.'     ||     input_string  [  index  ]     ==     '?'     ||     input_string  [  index  ]     ==     ''  )     {      // Do nothing      }     else     {      output_string     +=     ' '  ;      }      space_flag     =     false  ;      }      output_string     +=     input_string  [  index  ];      }     else     if     (  index     >     0     &&     input_string  [  index     -     1  ]     !=     ' '  )     {      space_flag     =     true  ;      }      }      std  ::  cout      < <     output_string      < <     std  ::  endl  ;      return     0  ;   }   
Java
   public     class   Main     {      public     static     void     main  (  String  []     args  )     {      String     inputString     =     ' Hello Geeks . Welcome  Do you love Geeks  Geeks ? '  ;      String     outputString     =     ''  ;      boolean     spaceFlag     =     false  ;     // Flag to check if spaces have occurred      for     (  int     index     =     0  ;     index      <     inputString  .  length  ();     ++  index  )     {      if     (  inputString  .  charAt  (  index  )     !=     ' '  )     {      if     (  spaceFlag  )     {      if     (  inputString  .  charAt  (  index  )     ==     '.'     ||     inputString  .  charAt  (  index  )     ==     '?'     ||     inputString  .  charAt  (  index  )     ==     ''  )     {      // Do nothing      }     else     {      outputString     +=     ' '  ;      }      spaceFlag     =     false  ;      }      outputString     +=     inputString  .  charAt  (  index  );      }     else     if     (  index     >     0     &&     inputString  .  charAt  (  index     -     1  )     !=     ' '  )     {      spaceFlag     =     true  ;      }      }      System  .  out  .  println  (  outputString  );      }   }   
Python3
   # Python program to Remove    # extra spaces from a string   input_string   =    ' Hello Geeks . Welcome  Do you love Geeks  Geeks ? '   output_string   =   []   space_flag   =   False   # Flag to check if spaces have occurred   for   index   in   range  (  len  (  input_string  )):   if   input_string  [  index  ]   !=   ' '  :   if   space_flag   ==   True  :   if   (  input_string  [  index  ]   ==   '.'   or   input_string  [  index  ]   ==   '?'   or   input_string  [  index  ]   ==   ''  ):   pass   else  :   output_string  .  append  (  ' '  )   space_flag   =   False   output_string  .  append  (  input_string  [  index  ])   elif   input_string  [  index   -   1  ]   !=   ' '  :   space_flag   =   True   print   (  ''  .  join  (  output_string  ))   
C#
   using     System  ;   class     Program   {      static     void     Main  ()      {      string     inputString     =     ' Hello Geeks . Welcome to GeeksforGeeks  Do you love Geeks  Geeks ? '  ;      char  []     outputArray     =     new     char  [  inputString  .  Length  ];     // Using char array for efficient string building      int     outputIndex     =     0  ;      bool     spaceFlag     =     false  ;     // Flag to check if spaces have occurred      for     (  int     index     =     0  ;     index      <     inputString  .  Length  ;     ++  index  )      {      if     (  inputString  [  index  ]     !=     ' '  )      {      if     (  spaceFlag  )      {      // Check if the current character is a punctuation mark      if     (  inputString  [  index  ]     ==     '.'     ||     inputString  [  index  ]     ==     '?'     ||     inputString  [  index  ]     ==     ''  )      {      // Do nothing      }      else      {      outputArray  [  outputIndex  ++  ]     =     ' '  ;      }      spaceFlag     =     false  ;      }      outputArray  [  outputIndex  ++  ]     =     inputString  [  index  ];      }      else     if     (  index     >     0     &&     inputString  [  index     -     1  ]     !=     ' '  )      {      spaceFlag     =     true  ;      }      }      string     outputString     =     new     string  (  outputArray       0       outputIndex  );     // Convert char array to string      Console  .  WriteLine  (  outputString  );      }   }   
JavaScript
   let     inputString     =     ' Hello Geeks . Welcome  Do you love Geeks  Geeks ? '  ;   let     outputString     =     ''  ;   let     spaceFlag     =     false  ;     // Flag to check if spaces have occurred   for     (  let     index     =     0  ;     index      <     inputString  .  length  ;     ++  index  )     {      if     (  inputString  [  index  ]     !==     ' '  )     {      if     (  spaceFlag  )     {      if     (  inputString  [  index  ]     ===     '.'     ||     inputString  [  index  ]     ===     '?'     ||     inputString  [  index  ]     ===     ''  )     {      // Do nothing      }     else     {      outputString     +=     ' '  ;      }      spaceFlag     =     false  ;      }      outputString     +=     inputString  [  index  ];      }     else     if     (  index     >     0     &&     inputString  [  index     -     1  ]     !==     ' '  )     {      spaceFlag     =     true  ;      }   }   console  .  log  (  outputString  );   

Lähtö:   

 Hello Geeks. Welcome to GeeksforGeeks. Do you love Geeks Geeks?   

Ajan monimutkaisuus yllä olevasta liuoksesta on O (n). 
Aputila on o (n), koska toinen luettelo oli luotava. 

Menetelmä 3: (Käyttämällä sisäänrakennettua toimintoa)

C++
   #include          #include         #include         int     main  ()     {      std  ::  string     str     =     ' Hello Geeks . Welcome  Do you love Geeks  Geeks ? '  ;          // Use regular expression to replace multiple spaces with a single space      std  ::  regex     pattern  (  '  \  s+'  );      std  ::  string     result     =     std  ::  regex_replace  (  str       pattern       ' '  );          // Remove leading and trailing spaces      size_t     firstNonSpace     =     result  .  find_first_not_of  (  ' '  );      size_t     lastNonSpace     =     result  .  find_last_not_of  (  ' '  );          if     (  firstNonSpace     !=     std  ::  string  ::  npos     &&     lastNonSpace     !=     std  ::  string  ::  npos  )     {      result     =     result  .  substr  (  firstNonSpace       lastNonSpace     -     firstNonSpace     +     1  );      }          std  ::  cout      < <     result      < <     std  ::  endl  ;          return     0  ;   }   // code contributed by shinjanpatra   
Java
   /**   Java Program to remove extra spaces from a string   **/   public     class   GFG     {      public     static     void     main  (  String     args  []  )     {      String     str     =     ' Hello Geeks . Welcome  Do you love Geeks  Geeks ? '  ;      System  .  out  .  println  (  str  .  replaceAll  (  '\s+'    ' '  ).  trim  ());      }   }   
Python3
   # Python program to remove extra spaces from a string   # Input string   str   =   ' Hello Geeks . Welcome  Do you love Geeks  Geeks ? '   # Removing extra spaces using regex   import   re   str   =   re  .  sub  (  's+'     ' '     str  )  .  strip  ()   # Printing the final string   print  (  str  )   
C#
   // C# Program to remove   // extra spaces from a string   using     System  ;   class     Program     {      static     void     Main  (  string  []     args  )      {      string     str      =     ' Hello Geeks . Welcome  Do you love Geeks  Geeks ? '  ;      // Removing extra spaces using regex and print      Console  .  WriteLine  (      System  .  Text  .  RegularExpressions  .  Regex  .  Replace  (      str  .  Trim  ()     @'s+'       ' '  ));      }   }   
JavaScript
    <  script  >   // JavaScript Program to remove   // extra spaces from a string   var     str     =     ' Hello Geeks . Welcome  Do you love Geeks  Geeks ? '  ;   document  .  write  (  str  .  replace  (  '\s+'       ' '  ).  trim  ());   // This code is contributed by rdtank    <  /script>   

Lähtö:  

 Hello Geeks . Welcome  Do you love Geeks  Geeks ?   

Ajan monimutkaisuus : O (n) missä n on merkkijonon merkkejä. 
Aputila: O (1) Koska on vain pieniä kirjaimia.


Tämän artikkelin on annettu Aarti_rathi ja Aditya Goel .