Проблема, чтобы понять, почему код не работает

#python #python-3.x

#python #python-3.x

Вопрос:

Учитывая 2 строки, a и b, верните количество позиций, в которых они содержат подстроку одинаковой длины 2. Таким образом, «xxcaazz» и «xxbaaz» дают 3, поскольку подстроки «xx», «aa» и «az» отображаются в одном и том же месте в обеих строках.

Для решения этой проблемы я написал следующий код :

   def string_match(a, b):
     result  = 0
     tiniest = b
     biggest = a
     if len(a) < 2 or len(b) < 2:
      return 0

     if len(a) < len(b):
       tiniest = a
       print('tiniest is {} and size minus 1 equals 
  {}'.format(str(tiniest), len(tiniest)-1))
       biggest = b
     else:
       tiniest = b
       print('ELSE tiniest is {} and size minus 1 equals {}'.format(str(tiniest), len(tiniest) - 1))
       biggest = a

       for i in range(len(tiniest) - 1):
         print(i)
         if tiniest[i:i 2] == biggest[i:i 2]:
             print('tiniest is {} and biggest is {} and i is 
  {}'.format(tiniest[i:i 2], biggest[i:i 2], i))
             result = result   1
         else:
            continue
         print("result is ",result)
     return result
  

Итак, для теста :
string_match(‘helloooo’, ‘hello’) или string_match(‘hello’, ‘привет’) => без проблем функция возвращает 4, как и ожидалось

Но как только первый параметр становится меньше второго, ничего больше не работает, по причине, которую я не понимаю: string_match(‘hell’, ‘hello’) => ничего не делает , почему???

Я не вижу разницы между моим решением и официальным решением этой проблемы, которое:

 def string_match(a, b):
    # Figure which string is shorter.
    shorter = min(len(a), len(b))
    count = 0

    # Loop i over every substring starting spot.
    # Use length-1 here, so can use char str[i 1] in the loop
    for i in range(shorter - 1):
        a_sub = a[i:i   2]
        b_sub = b[i:i   2]
        if a_sub == b_sub:
            count = count   1

    return count 
  

Также можно ли инициализировать переменные result tiniest и biggest в начале функции?

Спасибо

Комментарии:

1. Цикл For имеет отступ внутри условия else, что может быть проблемой.

2. Принимаете ли вы другое решение, которое лучше, чем у вас есть в настоящее время?

3. @ksholla20 возможно, вы определенно правы.

4. @Austin конечно, я согласен, я просто не мог понять, почему мой код не работает. Но это из-за плохого отступа… я новичок в python 🙂

Ответ №1:

На самом деле это была проблема с отступом. Цикл for находился внутри отступа else. Поместив цикл for на тот же уровень, что и оператор else, решил ее:

 def string_match(a, b):
   result  = 0
   tiniest = b
   biggest = a
   if len(a) < 2 or len(b) < 2:
    return 0

   if len(a) < len(b):
     tiniest = a
     print('tiniest is {} and size minus 1 equals {}'.format(str(tiniest), len(tiniest)-1))
     biggest = b
   else:
     tiniest = b
     print('ELSE tiniest is {} and size minus 1 equals {}'.format(str(tiniest), len(tiniest) - 1))
     biggest = a


   for i in range(len(tiniest) - 1):
     print(i)
     if tiniest[i:i 2] == biggest[i:i 2]:
       print('tiniest is {} and biggest is {} and i is {}'.format(tiniest[i:i 2], biggest[i:i 2], i))
       result = result   1
     else:
       continue
   print("result is ",result)
   return result