2016-04-20 3 views
-1

У меня есть код, над которым я работаю, но он не выводится так же хорошо, как мне нужно. Я должен был составить свой собственный алгоритм для кода в python, который учитывает символы в вводах. Это похоже на стог сена в методе иглы, но я не должен использовать какие-либо методы сравнения текста, такие как count() и findall(). Я хотел бы, чтобы мой код подсчитывал символ по символу и не считал совпадающие буквы. Я ищу самую длинную общую подстроку. Вот мой код до сих пор, но он выводит все еще неправильно. Когда я ввожу «aaaaa» в поле String1 и «aa» в поле String 2, он выводит 1, но он должен выводить 2, потому что в «aaaaa» есть 2 «aa», без перекрытия.Подсчет общих символов между двумя строками в python

test1 = input("String1: ") 
    test2 = input("String2: ") 

    common = {} 
    if len(test1)<len(test2): 
    for letter in test1: 
     if letter in test2: 
      common[letter]= 1 

    else: 
    for letter in test2: 
     if letter in test1: 
      common[letter]= 1 
    print (len(common)) 
+0

Можете ли вы привести больше примеров? –

+2

Вы спрашиваете о [самой длинной общей подстроке] (https://en.wikipedia.org/wiki/Longest_common_substring_problem) или [подпоследовательности] (https://en.wikipedia.org/wiki/Longest_common_subsequence_problem)? –

+0

Вы можете использовать 'set' решение из следующего: http://stackoverflow.com/questions/17666963/python-get-common-characters-from-strings – Kujira

ответ

1

Так одна из проблем с вашим кодом является способом вы подсчета вхождений символов, если вы делаете «АААА» и «AA» выход, как вы сказали, 2 но в текущем коде будет 1 независимо. Вот исправление.

import re 
test1 = input("String1: ") 
test2 = input("String2: ") 

common = {} 
if len(test1) < len(test2): 
    for letter in test1: 
     if letter in test2: 
      common[letter] = len(re.findall(letter, test2)) 

else: 
    for letter in test2: 
     if letter in test1: 
      common[letter] = len(re.findall(letter, test1)) 
for word, count in common.items(): 
    print("{0}\t{1}".format(word,count)) 
+0

Вы можете сократить блоки «if letter in common», используя шаблон «common [letter] = common.get (letter, 0) + 1' или используя' defaultdict'. – Alfe

+0

Спасибо, но он по-прежнему выводится так же, как и мой код. Если я набираю String1 «aaaaa» и в строке2 «aa», он должен вывести 2, потому что в строке 1 есть два «aa», но он выводит только 1. – Mell

+0

Проблема заключается в том, что вы печатаете длину словарь, а не фактические подсчеты. Я отредактировал код, чтобы исправить это. – Seekheart

Смежные вопросы