63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406

Разделить слово на части

02.04.2021, 22:38. Показов 3248. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно разделить число на максимальное число частей так, чтобы каждая буква встречалась только в одной части.
из arsegg получится a r s e gg, из assembler получится не ass embler, но a ss emble r. Из remember получится remember.

Вот мой код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
word = input()
output = []
current_part = ""
 
i = 0
while i < len(word):
    letter = word[i]
    while letter in word[i:] and i < len(word):
        current_part = current_part + word[i]
        i += 1
        continue
    else:
        output.append(current_part)
        current_part = ""
 
print(*output)
Но он не работает на вот таких словах

страстность
получается: страстнос т ь
должно: страстност ь

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

Алгоритм берет букву как проверочную и проверяет, есть ли она дальше в слове. Если она дальше есть, то в текущую часть добавляется текущая буква слова. Если её дальше нет, то часть добавляется в список и обнуляется, и алгоритм выполняется заново. Но проблема в том, что буквы, которые в части слова между проверочными буквами, могут повторяться потом.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.04.2021, 22:38
Ответы с готовыми решениями:

Разделить матрицу на 4 части
Подскажите как вывести ещё 2 части матрицы(верхняя правая и нижняя левая часть) или может быть есть какой то другой способ разделения...

Разделить файл на части
есть файл .txt (строка длиной n &gt;&gt; 1000000) Нужно написать программу, которая будет делить этот файл на n//200000 файлов. поскольку я...

Разделить 2д вектор на равные части
Здрасте, как можно разделить 2д вектор на заданное количество равных частей, и получить их значения?

21
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
02.04.2021, 23:09

Не по теме:

Цитата Сообщение от gray621 Посмотреть сообщение
arsegg получится a r s e gg
Кликните здесь для просмотра всего текста


По теме: ничего не понятно.
1
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
02.04.2021, 23:24  [ТС]
Arsegg, Нужно разделить слово на части. Каждая буква слова встречается только в одной из частей.
Пример assembler
В слове assembler множество букв - a, s, e, m, b, l, r
Нужно, чтобы каждая из этих букв встречалась только один раз во всех частях.
Поэтому получается: a ss emble r (буква a встречается только в первой части, буква s только во второй части, буквы e, m, b, l встречаются только в третьей части, буква r встречается только в четвёртой части)

Пример arsegg
получается a r s e gg, т.к. буква a встречается только в первой части, буква r только во второй части и т.д.
если бы было arsegga, то была бы только одна часть arsegga, т.к. нужно чтобы каждая буква встречалась во всех частях ровно один раз. Если разделить на arsegg a, то буква a будет встречаться в 2 частях, что неправильно, поэтому arsegga.

Добавлено через 36 секунд
А и нужно разделить на максимальное кол-во частей
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
03.04.2021, 00:26
Как-то так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from collections import Counter
 
def solution():
    word = input()
    letters = Counter(word)
    result = [[]]
    for letter in word:
        letters[letter] -= 1
        if letters[letter]:
            result[-1].append(letter)
        else:
            if any(letters[c] for c in result[-1]):
                result[-1].append(letter)
            else:
                result[-1].append(letter)
                result.append([])
    print(*map("".join, result))
 
if __name__ == "__main__":
    solution()
0
03.04.2021, 00:30

Не по теме:

Боже! Кто выдумывает такую дичь?..

1
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
03.04.2021, 00:31
Лучший ответ Сообщение было отмечено gray621 как решение

Решение

Оптимизированная версия:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from collections import Counter
 
def solution():
    word = input()
    letters = Counter(word)
    result = [[]]
    for letter in word:
        letters[letter] -= 1
        result[-1].append(letter)
        if all(letters[c] == 0 for c in result[-1]):
            result.append([])
    print(*map("".join, result))
 
if __name__ == "__main__":
    solution()
1
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
03.04.2021, 12:11  [ТС]
Arsegg, как-то можно исправить мой вариант?
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
03.04.2021, 12:26
Цитата Сообщение от gray621 Посмотреть сообщение
как-то можно исправить мой вариант?
Никак. Разбирайся))
P. S. collections.Counter я точно не стану переписывать в dict.
/upd
Да и твой алгоритм работает за O(N ^ 2). Так, между делом, даже если его довести до ума - смысла в нем мало.
0
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
04.04.2021, 14:19  [ТС]
Arsegg, Я исправил свой вариант. Мне кажется это костыль, но теперь всё работает.
Python
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
word = input()
output = []
current_part = ""
i = 0
 
while i < len(word):
    letter = word[i]
    while letter in word[i:] and i < len(word):
        current_part = current_part + word[i]
        i += 1
        continue
    else:
        changes = True
        while changes:
            changes = False
            for j in range(1, len(current_part)):
                if i < len(word) and len(current_part) > j:
                    letter = current_part[j]
                    while letter in word[i:] and i < len(word):
                        current_part = current_part + word[i]
                        changes = True
                        i += 1
                        continue
        output.append(len(current_part))
        current_part = ""
 
print(*output)
В первом while внутри while создаётся основная часть слова
В else идёт проверка букв в этой части на наличие дальше в слове. while changes для проверки были ли добавлены буквы и если да, то проверка идёт опять и т.д. пока не будет изменений. Я думаю это быстрее, чем O(n**2)
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
04.04.2021, 14:53
Arsegg, ну у вас тоже не O(n) даже не O(n*logn) ближе к O(n^2) все равно, хотя задаче решается за O(n).
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
04.04.2021, 14:54
Цитата Сообщение от eaa Посмотреть сообщение
ну у вас тоже не O(n) даже не O(n*logn) ближе к O(n^2) все равно, хотя задаче решается за O(n).
O(N), внимательно посмотрите алгоритм.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
04.04.2021, 15:04
Arsegg, как скажете. пусть будет O(n). значит я ошибся.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
04.04.2021, 15:19
Цитата Сообщение от eaa Посмотреть сообщение
как скажете. пусть будет O(n). значит я ошибся.
Ок, вызов принят:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from collections import Counter
 
def solution():
    word = input()
    letters = Counter(word)  # В среднем O(N) - я думаю, это очевидно (худший случай, когда кривой хеш у строк опустим)
    result = [[]]
    for letter in word:  # O(N) - аналогично
        letters[letter] -= 1
        result[-1].append(letter)
        if all(letters[c] == 0 for c in result[-1]):  # O(M), M <= N
            result.append([])
    # Суммарно, будет не более N частей (result[i]) - O(M) => Общая асимтотика O(N)
    print(*map("".join, result))
 
if __name__ == "__main__":
    solution()
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
04.04.2021, 15:21
Python
1
word = 'a'+'b'*1000000 + 'a' +'cc'
у меня около 11 секунд без вывода считает.
видимо 1 миллион операций для python'a много
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
04.04.2021, 15:30
Цитата Сообщение от eaa Посмотреть сообщение
видимо 1 миллион операций для python'a много
Да, Python может "сгрызсть" только 10 ^ 5 за разумное время (<10 сек). А это линейный алгоритм.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
04.04.2021, 15:37
Цитата Сообщение от Arsegg Посмотреть сообщение
А это линейный алгоритм.
буду знать на будущее. Спасибо.
мое решение на за O(n) на этом примере работает за 0.3 секунды. ваше решение O(n) 11.5 секунд.
где подвох?!
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
04.04.2021, 15:51
Цитата Сообщение от eaa Посмотреть сообщение
мое решение на за O(n) на этом примере работает за 0.3 секунды.
Я ж не знаю, какое у вас решение.
0
63 / 52 / 11
Регистрация: 14.01.2021
Сообщений: 406
04.04.2021, 16:51  [ТС]
eaa, Arsegg, не парьтесь особо, это же просто яндекс. Кстати eaa, пришлите своё решение, пожалуйста

Добавлено через 1 минуту
кстати, а за сколько моё решение?

Добавлено через 2 минуты
вот решение Gdez,

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
word = input()
output = []
i = 0
while i < len(word):
    a = i
    b = word.rfind(word[i])
    j = 1
    if b > a:
        j = a+1
        while j < b:
            t = word.rfind(word[j])
            b = max(b, t)
            j += 1
    output.append(b-a+1)
    i += b-a+1
print(*output)
Спасибо, [nick]Gdez/nick].
Насколько быстрое решение Gdez?

Добавлено через 4 минуты
У меня костыль в решении видимо...
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
04.04.2021, 22:06
Да я то не парюсь))
Просто это классический пример когда программист игнорирует изучение алгоритмов.
И доказывает что белое это чёрное
Стандартная задача за O(n).
Свое решение я описал здесь:
Запруды
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
04.04.2021, 22:42
Цитата Сообщение от eaa Посмотреть сообщение
у меня около 11 секунд без вывода считает.
видимо 1 миллион операций для python'a много
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
In [1]: from collections import Counter
    ...:
    ...: def solution(word):
    ...:     letters = Counter(word)
    ...:     result = [[]]
    ...:     for letter in word:
    ...:         letters[letter] -= 1
    ...:         result[-1].append(letter)
    ...:         if all(letters[c] == 0 for c in result[-1]):
    ...:             result.append([])
    ...:     yield from map("".join, result)
    ...:
 
In [2]: word = 'a'+'b'*1000000 + 'a' +'cc'
 
In [3]: timeit solution(word)
464 ns ± 5.04 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
ЧЯДНТ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.04.2021, 22:42
Помогаю со студенческими работами здесь

Разделить список на две части
Здравствуйте! Подскажите пожалуйста, как реализовать задачу. Есть список чисел. Надо разбить его на 2 кучи в минимальной разностью. И...

Как разделить матрицу на равные части
Добрый день! Имеется .mat - фаил c размерностью (256, 256). Содержит в себе изображение сейсмического разреза. Как данную матрицу...

Разделить список на равные части, сохранив порядок
У меня есть отсортированный по возрастанию список, например Нужно узнать, возможно ли разделить его на 5 равных частей, в каждой...

Разделить вложенный список на примерно равные части
Здравствуйте, как мне разделить вложенный список на примерно равные части? Допустим есть list = ,,,,,,] Таких вложенных документов...

Разделить байтовый массив на части и поместить с список
Есть байтовый массив massiv = bytearray() Нужно разделить этот массив на части, которые по длине меньше некоторого числа N. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru