Поэтому перед нами стояла задача сделать код ниже быстрее, так как есть примеры кода, где потребуется ввод очень больших строк, подойдёт любая помощь.
w = input()
e = input()
aasd = ''
i = 0
for i in range(len(w)):
elif e[i] in w:
aasd = aasd + 'b'
i = i + 1
print(aasd)
Самая дорогая операция здесь кажется elif b[i] in a
(со сложностью O(len(a))
, так как поиск строки не оптимизирован как набор. Вы можете создать набор символов в a
, чтобы сделать поиск быстрее.
import sys
z = int(input())
a = input()
set_a = set(a)
b = input()
strs = ''
for i in range(z):
if b[i] == a[i]:
strs = strs + 'a'
elif b[i] in set_a:
strs = strs + 'b'
else:
strs = strs + 'c'
sys.stdout.write(strs)
Звонить list
на a
не нужно. Строка является итерируемой.
@trincot хороший улов
Обратите внимание, что этот код может завершиться ошибкой, если z
больше, чем любой из массивов, так как индекс выйдет за пределы. То же самое верно, если z
была установлена длина a
, но массив b
короче, чем a, и, конечно, наоборот.
@Mushroomator OP не запрашивал отладку кода. Ускорение было единственным условием здесь, которое было обеспечено
@AbhinavMathur правда. Тем не менее, я думаю, что хорошо дать новичку несколько намеков на то, какие еще проблемы есть с его кодом, это все, чего я хотел добиться.
Следующая функция выполнит работу с изменением ключа, используя set()
вместо списка, что уменьшит время выполнения с O(len(a) * len(b))
до O(len(a))
.
Некоторые другие изменения - это некоторые проверки длины массива, которые вам нужно сделать, чтобы убедиться, что ваш индекс не выйдет за пределы массива.
import sys
# what do you need z for?
# this will only cause problems, you can use len() instead to get the lenght of the string
# z = int(input())
a = input("Please enter string a: ")
b = input("Please enter string b: ")
def compare_strs(a, b):
strs = ''
# no need for this here as range will start at 0 by default
# i = 0
# set will have constant lookup time O(1)
lookupCharacters = set(a)
for i in range(len(a)):
# you need to make sure the index is in bounds of the array here!
if i < len(b):
if b[i] == a[i]:
strs = strs + 'a'
# this will now lookup in the set which takes O(1) and not O(len(a))
elif b[i] in lookupCharacters:
strs = strs + 'b'
strs = strs + 'c'
# no need for this here as range() will automatically increase i for the next iteration
# i = i + 1
sys.stdout.write(strs)
compare_strs(a, b)
Извините, здесь опечатка. Очевидно, имелось в виду использование lookupCharacters
вместо a
. Обновил мой ответ.
Участие в редактировать войну неразумно. Как правило, если код работал/был синтаксически правильным перед редактированием, сохраните его в своем редактировании.