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

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

01.08.2024, 21:38. Показов 4385. Ответов 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
6257 / 2977 / 1050
Регистрация: 01.06.2021
Сообщений: 11,037
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
6257 / 2977 / 1050
Регистрация: 01.06.2021
Сообщений: 11,037
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
6257 / 2977 / 1050
Регистрация: 01.06.2021
Сообщений: 11,037
02.08.2024, 22:24  [ТС]
nalbe666, вроде всё правильно
1
 Аватар для analogov net
2532 / 1130 / 494
Регистрация: 17.11.2018
Сообщений: 2,836
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
6257 / 2977 / 1050
Регистрация: 01.06.2021
Сообщений: 11,037
04.08.2024, 14:17  [ТС]
Цитата Сообщение от analogov net Посмотреть сообщение
рекурсивный вариант...
сделай так, чтобы функция строку возвращала вместо печати, а я потом сравню скорость
0
 Аватар для analogov net
2532 / 1130 / 494
Регистрация: 17.11.2018
Сообщений: 2,836
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
6479 / 5702 / 1132
Регистрация: 11.10.2019
Сообщений: 15,187
04.08.2024, 18:53
analogov net, хвостовую рекурсию оптимизатор и так превратит в цикл
0
 Аватар для analogov net
2532 / 1130 / 494
Регистрация: 17.11.2018
Сообщений: 2,836
04.08.2024, 18:57
Цитата Сообщение от Алексей1153 Посмотреть сообщение
хвостовую рекурсию оптимизатор и так превратит в цикл
Алексей1153, пусть только попробует... Я ему...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6257 / 2977 / 1050
Регистрация: 01.06.2021
Сообщений: 11,037
04.08.2024, 18:58  [ТС]
Цитата Сообщение от analogov net Посмотреть сообщение
char*
я имел в виду string, как на входе, так и на выходе
0
 Аватар для analogov net
2532 / 1130 / 494
Регистрация: 17.11.2018
Сообщений: 2,836
04.08.2024, 19:03
Цитата Сообщение от Royal_X Посмотреть сообщение
я имел в виду string
АААА... ну, звиняйте... В си string-а нету...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6257 / 2977 / 1050
Регистрация: 01.06.2021
Сообщений: 11,037
04.08.2024, 19:06  [ТС]
Цитата Сообщение от analogov net Посмотреть сообщение
В си string-а нету...
тогда и проверить не смогу

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

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

Алексей1153, прошу не офтопить в теме
0
фрилансер
 Аватар для Алексей1153
6479 / 5702 / 1132
Регистрация: 11.10.2019
Сообщений: 15,187
04.08.2024, 19:22
Цитата Сообщение от Royal_X Посмотреть сообщение
и я лучше знаю, что нужно, а что нет
как выясняется - не лучше
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6257 / 2977 / 1050
Регистрация: 01.06.2021
Сообщений: 11,037
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
Ответ Создать тему
Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru