Видаліть додаткові проміжки з рядка

Дано рядок, що містить багато послідовних пробілів, обрізати всі простори, щоб усі слова містяли Тільки один простір між ними. Перетворення слід здійснювати на місці, а рішення повинно обробляти задні та провідні простори, а також видаляти попередні простори перед загальною пунктуацією, як повна кома, та знак запитання.

Приклади: 

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


Ця проблема є продовженням Видаліть проміжки із заданої рядка

Метод 1:

  • Ідея полягає в підтримці 2 покажчиків. Спочатку обидва вказують на початок масиву.
  • Перший вказівник відстежує наступну позицію, яка повинна бути заповнена у вихідному рядку.
  • Другий покажчик розвинений для читання всіх символів рядка по черзі.
  • При пошуку будь-якого небічного персонажа персонаж скопіюється в розташування першого вказівника, а потім вдосконалено і перші, і другі покажчики.
  • Якщо не-космічний символ-це повна кома-зупинка або знак запитання, ми також видаляємо будь-який попередній простір перед нею.
  • При пошуку послідовних космічних символів один простір копіюється в розташування першого вказівника та відпочинку, ігнорується. Провідні та задні місця обробляються окремо в розчині.


Нижче наведено C ++ реалізацію вищевказаної ідеї.

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  );   

Вихід:  

 Hello Geeks. Welcome to GeeksforGeeks.   


Складність часу вище розчину - o (n).
Допоміжний простір є O (1), оскільки перетворення проводиться на місці.

Метод 2:
Ще одне рішення з використанням заздалегідь визначених функцій у Python 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  );   

Вихід:   

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

Складність часу вище розчину - o (n). 
Допоміжний простір є o (n), як довелося створити інший список. 

Метод 3: (Використання вбудованої функції)

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>   

Вихід:  

 Hello Geeks . Welcome  Do you love Geeks  Geeks ?   

Складність часу : O (n), де n - кількість символів у рядку. 
Допоміжний простір: O (1), оскільки існують лише малі літери.


Ця стаття сприяє Aarti_rathi і Адітя Гель .