Удалить повторяющиеся символы в строке c

Удалить повторяющиеся символы в строке c

Вводится строка. Требуется удалить из нее повторяющиеся символы и все пробелы. Например, если было введено "abc cde def", то должно быть выведено "abcdef".

Проще всего задачу решить, если формировать результирующую строку в другой переменной, а не изменять значение переменной, которой была присвоена введенная строка.

Извлекать каждый символ введенной строки. Если он не встречается в новой строке и не является пробелом, то добавлять его в конец новой строки.

769 просмотра

5 ответа

1 Репутация автора

Я хочу удалить повторяющиеся символы из строки. Логика, которую я использовал, заключается в том, чтобы взять строку, а затем скопировать ее в другую, а затем указать первый символ первой строки и выполнить цикл по всем символам другой строки, а если удалить то же самое, но я где-то ошибаюсь, можете ли вы указать нам ,

Ответы (5)

плюса

91 Репутация автора

В вашем коде, когда вы «удаляете» символ, все, что вы делаете, это копируете символ после него и игнорируете все остальное. Это вызывает многочисленные ошибки в вашем коде. При удалении вы должны скопировать все символы после дублированного символа.

В настоящее время при удалении персонажа

Что ты должен делать

Также я думаю, что вам нужен нулевой символ в конце b, чтобы cout правильно его печатал?

(| = конец строки через len2, -> операция удаления, Размещён: 09.09.2017 08:30

плюса

1498 Репутация автора

Я использовал дополнительное пространство O (N) ( строка ), а временная сложность решения — O (N) .

плюса

428 Репутация автора

Вы можете использовать этот способ для удаления дубликатов, это зависит от пометки дубликата ‘*’, но это не будет работать, если строка также содержит символы.

этот код O (N * N), который занимает много времени с длинными строками, так что это еще один способ его оптимизации:

Этот код равен O (N), так как вставка в заданную структуру данных равна O (1) .

приведенный выше код с использованием строк :

Автор: Amr Adel Размещён: 09.09.2017 09:26

1 плюс

115124 Репутация автора

Это лучше сделать с помощью стандартной библиотеки:

  • std::string держать строку вместо символьных массивов.
  • std::set для хранения набора символов, которые уже встречались.
  • std::remove_if с лямбда-функцией для реорганизации строки, чтобы дубликаты были в конце.
  • std::string::erase удалить дубликаты.

Вот пример такого подхода:

Автор: cdhowie Размещён: 09.09.2017 09:33

плюса

34 Репутация автора

C-ish решение

Я добавлю это, поскольку ваш код больше похож на C, чем на C ++ ( strlen и cout на той же странице выглядит немного подозрительно). Это решение будет состоять из дополнительного массива из 127 логических значений (127 символов в ASCII), которые будут отслеживать символы, с которыми вы столкнулись. Первоначально для массива будет установлено значение false, поскольку мы еще не нашли ни одного символа. Это решение избавит нас от накладных расходов, необходимых для фактического поиска символов в другом массиве или наборе с использованием алгоритма поиска. Имейте в виду, что strlen размер строки вычисляется каждый раз, когда она вызывается, поэтому, если вы знаете, что у вас есть 2 строки одинакового размера, не вызывайте strlen обе. Символ во входном массиве будет использоваться в качестве индексов в массиве bool. Это будет работать, так как символы являются целыми числами. Так foundChar[c] что в значительной степени переведем на "

Читайте также:  Microsoft word межстрочный интервал

Вы могли заметить, что в моем цикле for я написал i , что должно вывести меня за пределы строки. Хотя это правда, это не вытащит меня из памяти строки. Строка C ++ всегда заканчивается нулем. Это означает, что каждая строка заканчивается символом ‘ 0’ или 0. Этот управляющий символ сообщает нам, где заканчивается строка (в основном это то, как strlen ее размер вычисляется). Таким образом, это означает, что когда мы выделяем память строки, мы всегда должны помнить, что дополнительный байт, необходимый для хранения управляющего символа ( char[3] c = "abc" выдаст вам ошибку. Правильный способ сделать это char[4] c = "abc" , «abc» эквивалентно «abc 0» «). Что, как говорится, strlen дает вам «полезную» длину строки без 0 в конце. Таким образом, цикл for выполняет итерацию по всем символам строки, но он также обязательно копирует ‘ 0’ в конце b, так как это сам символ и foundChar[0] будет ложным до конца.

О производительности

Это O (N) решение. Я использовал только 127 дополнительных байтов пространства (что незначительно). Я не думаю, что вы можете получить от этого больше производительности, поскольку необходима итерация по крайней мере один раз. Во всяком случае, я думаю, что это самый чистый путь для того, чего вы хотите достичь.

При разборе предложения на отдельные слова может оказаться, что в начале или в конце некоторых слов стоят пробелы. If you are parsing a sentence into individual words, you might end up with words that have blank spaces (also called white spaces) on either end of the word. В этом случае можно воспользоваться методами сокращения в классе System.String, чтобы удалить любое количество пробелов или других символов из указанной позиции в строке. In this situation, you can use one of the trim methods in the System.String class to remove any number of spaces or other characters from a specified position in the string. В таблице ниже описаны доступны методы сокращения. The following table describes the available trim methods.

Имя метода Method name Использование Use
String.Trim Удаление пробелов или знаков, указанных в массиве знаков, из начала и конца строки. Removes white spaces or characters specified in an array of characters from the beginning and end of a string.
String.TrimEnd Удаление символов, указанных в массиве символов, в конце строки. Removes characters specified in an array of characters from the end of a string.
String.TrimStart Удаление символов, указанных в массиве символов, в начале строки. Removes characters specified in an array of characters from the beginning of a string.
String.Remove Удаление указанного количества символов в указанной позиции индекса в строке. Removes a specified number of characters from a specified index position in a string.
Читайте также:  Как отремонтировать дисплей смартфона

Trim Trim

Простой способ удалить пробелы с обоих концов строки — метод String.Trim, использование которого показано в следующем примере. You can easily remove white spaces from both ends of a string by using the String.Trim method, as shown in the following example.

Кроме того, можно удалить символы, указанные в массиве знаков, из начала и конца строки. You can also remove characters that you specify in a character array from the beginning and end of a string. В следующем примере удаляются символы пробелов, точки и звездочки. The following example removes white-space characters, periods, and asterisks.

TrimEnd TrimEnd

Метод String.TrimEnd удаляет символы в конце строки, создавая новый строковый объект. The String.TrimEnd method removes characters from the end of a string, creating a new string object. Для указания символов, которые следует удалять, в этот метод передается массив символов. An array of characters is passed to this method to specify the characters to be removed. Порядок элементов в массиве символов не влияет на выполнение операции сокращения. The order of the elements in the character array does not affect the trim operation. В случае обнаружения символа, который отсутствует в массиве, операция останавливается. The trim stops when a character not specified in the array is found.

Ниже приведен пример удаления последних букв строки с помощью метода TrimEnd. The following example removes the last letters of a string using the TrimEnd method. В этом примере положение символов ‘r’ и ‘W’ изменено для иллюстрации того, что порядок символов в массиве не имеет значения. In this example, the position of the ‘r’ character and the ‘W’ character are reversed to illustrate that the order of characters in the array does not matter. Обратите внимание, что этот код удаляет последнее слово MyString и часть первого. Notice that this code removes the last word of MyString plus part of the first.

Этот код выводит на консоль значение He . This code displays He to the console.

Читайте также:  Как создать формулу суммы в excel

Ниже приведен пример удаления последнего слова строки с помощью метода TrimEnd. The following example removes the last word of a string using the TrimEnd method. В этом коде после слова Hello следует запятая, а поскольку запятая не указана в массиве символов для сокращения, то выполнение операции прекращается на запятой. In this code, a comma follows the word Hello and, because the comma is not specified in the array of characters to trim, the trim ends at the comma.

Этот код выводит на консоль значение Hello, . This code displays Hello, to the console.

TrimStart TrimStart

Метод String.TrimStart аналогичен методу String.TrimEnd за исключением того, что он создает новую строку путем удаления знаков в начале существующего строкового объекта. The String.TrimStart method is similar to the String.TrimEnd method except that it creates a new string by removing characters from the beginning of an existing string object. Для указания символов, которые следует удалять, в метод TrimStart передается массив символов. An array of characters is passed to the TrimStart method to specify the characters to be removed. Как и в случае с методом TrimEnd, порядок элементов в массиве символов не влияет на выполнение операции сокращения. As with the TrimEnd method, the order of the elements in the character array does not affect the trim operation. В случае обнаружения символа, который отсутствует в массиве, операция останавливается. The trim stops when a character not specified in the array is found.

В следующем примере удаляется первое слово в строке. The following example removes the first word of a string. В этом примере положение символов ‘l’ и ‘H’ изменено для иллюстрации того, что порядок символов в массиве не имеет значения. In this example, the position of the ‘l’ character and the ‘H’ character are reversed to illustrate that the order of characters in the array does not matter.

Этот код выводит на консоль значение World! . This code displays World! to the console.

Remove Remove

Метод String.Remove удаляет указанное количество знаков, начиная с указанного места в существующей строке. The String.Remove method removes a specified number of characters that begin at a specified position in an existing string. Этот метод подразумевает, что отсчет индекса начинается с нуля. This method assumes a zero-based index.

В следующем примере из строки удаляется десять символов, начиная с пятой позиции отсчитываемого от нуля индекса строки. The following example removes ten characters from a string beginning at position five of a zero-based index of the string.

Ссылка на основную публикацию
Тест для определения цвета волос
Пожалуйста, не копируйте понравившиеся вам статьи незаконно. Мы предлагаем вам разместить активную ссылку на наш сайт в случае, если вы...
Стим показывает что я не в сети
Не редко пользователи Steam встречаются с проблемой, когда подключение к интернету есть, браузеры работают, но клиент Стим не грузит страницы...
Стим саппорт украли аккаунт
Если ваш аккаунт Steam украли или взломали, то до его восстановления вам необходимо выполнить действия, указанные ниже, иначе аккаунт может...
Тест графики видеокарты 3dmark
Наиболее известная программа тестирования производительности, ставшая де-факто стандартом и точкой отсчета в измерениях игровых возможностей видеокарт. Основную популярность программе обеспечило...
Adblock detector