Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601

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

01.08.2024, 21:38. Показов 4494. Ответов 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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,335
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
04.08.2024, 19:06  [ТС]
Цитата Сообщение от analogov net Посмотреть сообщение
В си string-а нету...
тогда и проверить не смогу

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

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

Алексей1153, прошу не офтопить в теме
0
фрилансер
 Аватар для Алексей1153
6500 / 5731 / 1133
Регистрация: 11.10.2019
Сообщений: 15,335
04.08.2024, 19:22
Цитата Сообщение от Royal_X Посмотреть сообщение
и я лучше знаю, что нужно, а что нет
как выясняется - не лучше
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru