Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,465

Удаление повторяющейся части строки

01.08.2024, 21:38. Показов 4438. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хотел бы услышать различные мнения по вот такой задаче.

Нужно оставить в строке только уникальную начальную часть, а повторяющуюся хвостовую часть удалить.

Не то чтобы мне сложно самому написать код, но вот если у кого-нибудь есть хорошие идеи, как реализовать это очень эффективно, то прошу написать.

Примеры,

meowmeow → meow
meowme → meow
mmmmm → m
mmmmmr → mmmmmr
mmmmmrm → mmmmmr
kkkklsssskkkklsssskk → kkkklssss
kkkklsssskkkklssssskk → kkkklsssskkkklsssss
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.08.2024, 21:38
Ответы с готовыми решениями:

Удаление строк по повторяющейся ячейке
Есть 3 таблицы первая: Таблица 1: obj obj_id|owner_phone Таблица 2: obj_archive obj_id|owner_phone Таблица 2: obj_li ...

Удаление части строки
Доброго времени суток. Ломаю голову над проблемой второй день уже Есть конструкция типа <div...

Удаление части строки
В базе имеются такие строки 111.01 и 111.02.01 как обрезать строку, чтобы при выборке первый вариант (111.01) оставался...

54
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
02.08.2024, 19:43
Студворк — интернет-сервис помощи студентам
Royal_X, типа такого?:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>
#include <iterator>
 
size_t foo(const std::string& cstr)
{
    if (cstr.size() < 2) { return cstr.size(); }
    std::string::const_iterator cit1{ cstr.cbegin() }, cit2{ cit1 + 1 };
    for (; cit2 != cstr.cend(); ++cit2) {
        if (*cit2 == *cit1) { ++cit1; }
        else cit1 = cstr.cbegin();
    }
    return std::distance(cit1, cit2);
}
 
int main()
{
    std::string str[] = {
        "",
        "1",
        "mmmmmmmm",
        "ababcababcg",
        "meowmeow",
        "mmmmm",
        "mmmmmr",
        "mmmmmrm",
        "kkkklsssskkkklsssskk",
        "kkkklsssskkkklssssskk",
        "memememem"
    };
 
    for (auto& it : str) {
        std::cout << it.substr(0, foo(it)) << "\n";
    }
 
    while (1);
    return 0;
}
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,465
02.08.2024, 21:44  [ТС]
Цитата Сообщение от nalbe666 Посмотреть сообщение
типа такого?
типа да, но чтобы код работал правильно

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


а именно у тебя такие строки обрабатываются неправильно

abcdefgaabcdefabcdefgaabcdef
abcdefgabcabcdefabcdefgabcabcdef

правильно будет

abcdefgaabcdefabcdefga
abcdefgabcabcdefabcdefgabc


А вот мой код, хоть и медленный, но после многочисленных тестов, ошибок я в нем не нашел.
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
02.08.2024, 21:47
Royal_X, поправил

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
size_t foo(const std::string& cstr)
{
    if (cstr.size() < 2) { return cstr.size(); }
    std::string::const_iterator cit1{ cstr.cbegin() }, cit2{ cit1 + 1 };
    for (; cit2 != cstr.cend();  ++cit2) {
        if (*cit2 == *cit1) { ++cit1; }
        else {
            cit1 = cstr.cbegin();
            if (*cit2 == *cit1) { ++cit1; }
        }
    }
    return std::distance(cit1, cit2);
}
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,465
02.08.2024, 21:55  [ТС]
Цитата Сообщение от nalbe666 Посмотреть сообщение
поправил
код все еще неверно работает, но ошибок стало меньше

Например, вот такую строку твой код неправильно обрабатывает

qqwrjhaqvxrlqqq >>> qqwrjhaqvxrlqq

правильно будет qqwrjhaqvxrlq
1
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
02.08.2024, 22:10
Лучший ответ Сообщение было отмечено Royal_X как решение

Решение

Royal_X,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
size_t foo(const std::string& cstr)
{
    if (cstr.size() < 2) { return cstr.size(); }
    std::string::const_iterator cit1{ cstr.cbegin() }, cit2{ cit1 + 1 };
    for (; cit2 != cstr.cend();  ++cit2) {
        if (*cit2 == *cit1) { ++cit1; }
        else {
            cit2 -= std::distance(cstr.cbegin(), cit1);
            cit1 = cstr.cbegin();
        }
    }
    return std::distance(cit1, cit2);
}
2
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,465
02.08.2024, 22:24  [ТС]
nalbe666, вроде всё правильно
1
 Аватар для analogov net
2532 / 1130 / 494
Регистрация: 17.11.2018
Сообщений: 2,838
04.08.2024, 01:44
рекурсивный вариант...
C++
1
2
3
4
5
6
7
8
9
10
#include <cstdio>
 
bool print_pref(const char* s, int j = 1, int i = 0) {
    return !s[j] ? printf("%.*s\n", j - i, s) : (s[j] == s[i]) ? print_pref(s, j + 1, i + 1) : print_pref(s, j - i + 1);
}
 
int main() {
    print_pref("kkkklsssskkkklsssskk");    // kkkklssss
    print_pref("565656565");               // 56
}
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,465
04.08.2024, 14:17  [ТС]
Цитата Сообщение от analogov net Посмотреть сообщение
рекурсивный вариант...
сделай так, чтобы функция строку возвращала вместо печати, а я потом сравню скорость
0
 Аватар для analogov net
2532 / 1130 / 494
Регистрация: 17.11.2018
Сообщений: 2,838
04.08.2024, 18:51
Цитата Сообщение от Royal_X Посмотреть сообщение
чтобы функция строку возвращала вместо печати
например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
char* find_pref(char* s, int j = 1, int i = 0) {
    if(!s[j]){ 
        s[j - i] = 0;
        return s;
    }
    
    return find_pref(s, j + 1, (s[j] == s[i]) ? i + 1 : 0);
}
 
int main() {
    char str[] = "kkkklsssskkkklsssskk"; // kkkklssss
    
    std::cout << find_pref(str) << std::endl; 
}
Добавлено через 1 минуту
хотя, можно и не рекурсивную написать...
1
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
04.08.2024, 18:53
analogov net, хвостовую рекурсию оптимизатор и так превратит в цикл
0
 Аватар для analogov net
2532 / 1130 / 494
Регистрация: 17.11.2018
Сообщений: 2,838
04.08.2024, 18:57
Цитата Сообщение от Алексей1153 Посмотреть сообщение
хвостовую рекурсию оптимизатор и так превратит в цикл
Алексей1153, пусть только попробует... Я ему...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,465
04.08.2024, 18:58  [ТС]
Цитата Сообщение от analogov net Посмотреть сообщение
char*
я имел в виду string, как на входе, так и на выходе
0
 Аватар для analogov net
2532 / 1130 / 494
Регистрация: 17.11.2018
Сообщений: 2,838
04.08.2024, 19:03
Цитата Сообщение от Royal_X Посмотреть сообщение
я имел в виду string
АААА... ну, звиняйте... В си string-а нету...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,465
04.08.2024, 19:06  [ТС]
Цитата Сообщение от analogov net Посмотреть сообщение
В си string-а нету...
тогда и проверить не смогу

ведь на гонках все автомобили едят на одинаковой поверхности, а не так, что все на гравийной дороге, а твой на асфальтовом покрытии
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
04.08.2024, 19:09
Цитата Сообщение от Royal_X Посмотреть сообщение
я имел в виду string, как на входе, так и на выходе
можно сделать const std::string_view на входе и std::string_view на выходе. И это будет даже constexpr можно сделать
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,465
04.08.2024, 19:13  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
можно сделать
можно много чего сделать, как и много чего не сделать. Но я не собираюсь трогать чужие коды. Хочу проверить код в таком объективном виде, в котором его предоставил участник соревнования. А для этого функция должна использовать
Цитата Сообщение от Royal_X Посмотреть сообщение
string, как на входе, так и на выходе
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
04.08.2024, 19:17
Royal_X, в данной задаче не нужен std::string на входе. Это - ограничение (минус) твоего решения, а не остальных участников
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,465
04.08.2024, 19:20  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
в данной задаче не нужен std::string на входе.
лол, условие я здесь ставлю, как ТС, и я лучше знаю, что нужно, а что нет. Функция будет использоваться в другом коде, а не просто лежать в музее.

Добавлено через 1 минуту
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Это - ограничение (минус) твоего решения, а не остальных участников
давай тогда предлагай еще коды на ассемблере)))) правда, никогда не видел, чтобы ты на нем писал...

Алексей1153, прошу не офтопить в теме
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
04.08.2024, 19:22
Цитата Сообщение от Royal_X Посмотреть сообщение
и я лучше знаю, что нужно, а что нет
как выясняется - не лучше
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,465
04.08.2024, 19:24  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
как выясняется - не лучше
и конечно же ты не станешь здесь писать, что именно, а главное, как ты выяснил...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.08.2024, 19:24

Удаление части строки
В string у меня есть несколько символов. Мне необходимо удалить из строки определённый символ (позицию которого в строке я не знаю). Как я...

Удаление части строки
Добрый день. Нужна помощь. Дана строка типа &quot;C:\Program Files\Java\PHP\delete.txt&quot; (Директория может быть любой). Нужно удалить конец...

Удаление части строки
Дана строка. Из другой строки в текстовом файле надо удалить из строки эту указанную строку. Помогите реализовать. Я высчитал формулу,чтобы...

удаление части строки
Всем привет! Есть вопрос. У меня есть бинарный файл. В нем содержится информация: Идентификатор Фамилия Имя Отчество. А именно: 1 Иванов...

Удаление части строки
Имеется переменная, содержащая имя файла, например, $var = &quot;filename.txt&quot; Надо что-то сделать, чтоб чтоб осталось только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сезонность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru