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

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

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

ведь на гонках все автомобили едят на одинаковой поверхности, а не так, что все на гравийной дороге, а твой на асфальтовом покрытии
0
фрилансер
 Аватар для Алексей1153
6495 / 5726 / 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
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,543
04.08.2024, 19:13  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
можно сделать
можно много чего сделать, как и много чего не сделать. Но я не собираюсь трогать чужие коды. Хочу проверить код в таком объективном виде, в котором его предоставил участник соревнования. А для этого функция должна использовать
Цитата Сообщение от Royal_X Посмотреть сообщение
string, как на входе, так и на выходе
0
фрилансер
 Аватар для Алексей1153
6495 / 5726 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
04.08.2024, 19:17
Royal_X, в данной задаче не нужен std::string на входе. Это - ограничение (минус) твоего решения, а не остальных участников
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,543
04.08.2024, 19:20  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
в данной задаче не нужен std::string на входе.
лол, условие я здесь ставлю, как ТС, и я лучше знаю, что нужно, а что нет. Функция будет использоваться в другом коде, а не просто лежать в музее.

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

Алексей1153, прошу не офтопить в теме
0
фрилансер
 Аватар для Алексей1153
6495 / 5726 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
04.08.2024, 19:22
Цитата Сообщение от Royal_X Посмотреть сообщение
и я лучше знаю, что нужно, а что нет
как выясняется - не лучше
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6312 / 3035 / 1053
Регистрация: 01.06.2021
Сообщений: 11,543
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
Ответ Создать тему
Новые блоги и статьи
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru