Как проверить, являются ли две строки анаграммами и чувствительны ли они к регистру в Python? - PullRequest
0 голосов
/ 11 октября 2018

Хорошо, у меня есть две функции: одна проверяет, сколько раз символ появляется в строке, а другая должна проверять, являются ли две строки, введенные пользователем, анаграммами:

def function_one(s, ch):
    count = 0
    for c in s:
        if c == ch:
            count = count + 1
    return count

def function_two(s, t):
    while len(s) == len(t):
        y = function_one(s, t)
        if y == 0:
            return True
        else:
            return False

Прямо сейчасfunction_two вернет True, если две строки являются анаграммами, но также вернет True, если они являются анаграммами, но имеют заглавные буквы, и ничего не вернет, если они вообще не являются анаграммами.Что мне делать?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы можете отсортировать пары строк, которые не являются анаграммами, сначала проверив длину обеих строк.На втором этапе вы можете сравнить набор символов.Это очень быстро в Python.На последнем этапе вы должны посчитать вхождения отдельных символов в наборе, чтобы быть уверенными, что строки являются анаграммами.

CODE

from __future__ import print_function

def isAnagram(s1, s2) :
    s1, s2 = s1.lower(), s2.lower()

    if len(s1) == len(s2) :
        if set(s1) == set(s2) :
            return all([s1.count(c) == s2.count(c) for c in set(s1)])

    return False

string1 = 'Hello'
string2 = 'Hell'    # No anagram of string1
string3 = 'Holle'   # Anagram of string1    

print(isAnagram(string1, string2))
print(isAnagram(string1, string3))

ВЫХОД

False
True
0 голосов
/ 11 октября 2018

Есть много способов сделать это.Я думаю, что вы немного усложняете, написав эти функции.

Первый способ решить эту проблему, который мне пришёл в голову, - это создать список со всеми буквами в каждой строке, отсортировать их и сравнить оба списка:

def check_for_anagrams(string1, string2):
    list1 = list(string1.lower())
    list2 = list(string2.lower())
    list1.sort()
    list2.sort()

    return list1 == list2

это может быть не самый элегантный способ сделать это, но это быстрое решение.функция lower () превращает строки в строчные буквы. Функция sort () для списков сортирует список.

если две строки являются анаграммами, результатом этих операций будут два равных списка.

EDIT: Проверьте возможный дубликат потока, там есть несколько хороших решений!

...