Implemnting виде дерева структуры данных проблемы с HackerRank, используя Питон3


Я пытаюсь написать лучший код в Python. Я не знаю, где начать проверку. Я хочу убедиться, что я пишу кодекса лучшей практики.

Это вторая проблема в структуре Hackerrank трие сведения:

Учитывая Н строк. Каждая строка содержит только строчные буквы от (включительно). Набор струн считается хороший набор если строка является префиксом другой строки еще, это плохой набор. (Если две строки идентичны, они считаются префиксами друг друга.)

Например, Ааб, АБВГД, aabcd-это плохой набор , потому что "Ольборг" - префикс aabcd.

Принт хороший набор , если он удовлетворяет требованию задачи. Остальное, печати плохо установлен и первой строки, для которых условие не выполняется.

Формат Входного Сигнала

Первая строка содержит число строк в наборе. Затем следующий строк, где строка содержит строку.

Формат

Выход хороший набор , если набор является допустимым. Еще, выход плохой набор последовали первые строки, для которых условие не выполняется.

Образец Input00

7
aab
defgab
abcde
aabcde
cedaaa
bbbbbbbbbb
jabjjjad

Образец Output00

BAD SET
aabcde

Образец Input01

4
aab
aac
aacghgh
aabghgh

Образец Output01

BAD SET
aacghgh
from sys import stdin

class Node:
    def __init__(self,char):
        self.character = char
        self.children = {}
        self.counter = 0
        self.end_word = False

class Trie:
    def __init__(self):
        self.root = Node('*')

    def add(self,word):
        current = self.root
        fail = False
        for char in word:
            if char not in current.children:
                new_node = Node(char)
                current.children[char] = new_node
                current = new_node
                new_node.counter += 1

            else:
                current = current.children[char]
                current.counter += 1
                if current.end_word:
                    fail = True

        current.end_word = True
        # first word > second word : second word is prefix of first word
        if current.counter >=2:
            fail = True

        return fail

if __name__ == "__main__":
    tree = Trie()
    n = stdin.readlines()
    for i in n[1:]:
        i = i.strip()
        add_check_string = tree.add(i)
        if add_check_string:
            print("BAD SET")
            print(i)
            break
    if not add_check_string:
        print("GOOD SET")


182
4
задан 22 марта 2018 в 12:03 Источник Поделиться
Комментарии
3 ответа


  • Вы могли бы запустить autopep8 за незначительные исправления стиля (например, пробелы).

  • Именование переменных правильно всегда крайне важен, особенно в динамичном языке, без указания типа объекта:


    • Ваш trie это Trieне просто tree.

    • n звучит как целое. Его можно было бы назвать lines.

    • i также звучит как целое. Это может быть line или word.


  • Используя for/else синтаксис, вы можете реструктурировать свой главный способ без каких-либо флаг.


if __name__ == "__main__":
trie = Trie()
_header, *lines = stdin.readlines()
for line in lines:
word = line.strip()
if trie.add(word):
print("BAD SET")
print(word)
break
else:
print("GOOD SET")



  • Если вы хотите, вы могли бы заменить 3 последние строки add по return fail or current.counter >= 2

1
ответ дан 23 марта 2018 в 08:03 Источник Поделиться

Я думаю, что единственное изменение, которое я хотел бы сделать это удаление node.counterи вместо того, чтобы обнаруживать, если предыдущее слово является префиксом слова с проверкой current.fail==True.

0
ответ дан 22 марта 2018 в 08:03 Источник Поделиться

Есть большое повторение в add метод.
Это может быть упрощенный, угробив fail flag для

def add_unless_prefix(self,word):
current = self.root
for char in word:
if char not in current.children:
current.children[char] = Node(char)

current = current.children[char]
current.counter += 1
if current.end_word:
return True

current.end_word = True

return current.counter >=2

Это может быть немного упрощен, используя dict.setdefault.

if char not in current.children:
current.children[char] = Node(char)

current = current.children[char]

может стать current = current.children.setdefault(char, Node(char))

0
ответ дан 23 марта 2018 в 11:03 Источник Поделиться