Чтобы понять, что вам нужно реализовать на уровне сборки, первое, что вам нужно сделать, это понять алгоритм высокого уровня. Почему?
- Вам легче увидеть все случаи и крайние случаи вовремя!
- Чтобы вернуться к , что я пытался сделать снова? в середине программирования версии Assembly.
- Чтобы быстро увидеть, какие переменные вам (конечно) нужны.
Я написал следующую программу (простите меня, python был некоторое время для меня):
def is_in_string_1(string, substring):
"""
aaba: a, b, ab, ba, aba (last one will fail)
"""
length = len(string)
sublength = len(substring)
if (sublength == 0):
return True
j = 0
for i in range(0, length):
if string[i] != substring[j]:
j = 0
else:
j += 1
if j == sublength:
return True
return False
def is_in_string_2(string, substring):
"""
aaba: a, b, ab, ba, aba
"""
length = len(string)
sublength = len(substring)
for i in range(0, length + 1 - sublength): # string: aabc; substring: c; length: 4; sublength: 1; indexes: 0,1,2,3;
is_substring = True
for j in range(0, sublength): # for the sake of the algorithm, no slicing here
if string[i+j] != substring[j]:
is_substring = False
break
if is_substring:
return True
return False
stringTuples = [
("aaa", "aa"),
("aaa", "aaa"),
("aaa", "aab"),
("abc", "bc"),
("abc", "a"),
("abc", "abc"),
("aaa", ""),
("aaa", "b")
]
for stringTuple in stringTuples:
print(
stringTuple[0],
stringTuple[1],
':',
is_in_string_1(stringTuple[0], stringTuple[1]),
is_in_string_2(stringTuple[0], stringTuple[1]),
sep='\t'
)
Сначала я подумал, что могу оптимизировать стандартное решение (is_in_string_2
), исключив второе for-l oop (is_in_string_1
), но после некоторого размышления Я уже узнал, что это не удастся (крайнего случая даже не было ни в одном из моих тестовых данных!), Поэтому я оставил это как пример того, насколько важно, чтобы вы использовали правильный алгоритм.
Программа выдает следующий результат:
aaa aa : True True
aaa aaa : True True
aaa aab : False False
abc bc : True True
abc a : True True
abc abc : True True
aaa : True True
aaa b : False False
aaba aba : False True
Обратите внимание, что весь вывод был правильным, за исключением последней строки, где первый алгоритм неверен.
Перед тем, как продолжить:
- Вы должны сделать свою
len()
функцию в MIPS; обратите внимание, что вся строка (если я правильно помню) завершается нулем, поэтому вам придется подсчитать все ненулевые символы строки или, другими словами, подсчитать, сколько символов предшествует нулевому ограничителю. - Вы должны использовать
j
, $ra
и jr
вызовы go «функции» или подпрограмм . (Поиск) - Находясь в одном, вы можете вызывать другие функции , используя стек . (Поиск)