Python :: Aufgabe #331
4 Lösungen
Isomorphe Strings (Mustergleichheit)
Fortgeschrittener - Python
von JKooP
- 06.03.2021 um 17:43 Uhr
Als isomorph bezeichnet man zwei oder mehrere Strings (Texte),
die zwar inhaltlich unterschiedlich sind, aber dennoch das gleiche Muster aufweisen.
Achtung:
Gleiche Buchstaben bedeuten Musterwiederholung! ABAB ist nicht ABCD, aber CDCD.
Beispiele:
s1 = ABBA; s2 = OTTO => true
s1 = PAPER; s2 = TITLE => true
s1 = EGG; s2 = ADD => true
s1 = BADC; s2 = BABA => false
s1 = BBBAAABA; s2 = AAABBBBA => false
Erstelle eine Funktion/Methode, die zwei Strings (Texte) hinsichtlich Isomorphie vergleicht.
Viel Spaß
die zwar inhaltlich unterschiedlich sind, aber dennoch das gleiche Muster aufweisen.
Achtung:
Gleiche Buchstaben bedeuten Musterwiederholung! ABAB ist nicht ABCD, aber CDCD.
Beispiele:
s1 = ABBA; s2 = OTTO => true
s1 = PAPER; s2 = TITLE => true
s1 = EGG; s2 = ADD => true
s1 = BADC; s2 = BABA => false
s1 = BBBAAABA; s2 = AAABBBBA => false
Erstelle eine Funktion/Methode, die zwei Strings (Texte) hinsichtlich Isomorphie vergleicht.
Viel Spaß
Lösungen:
"""
#331: Isomorphe Strings (Mustergleichheit)
Erstelle eine Funktion/Methode, die zwei Strings (Texte) hinsichtlich Isomorphie vergleicht.
"""
def cast(cast_e):
cast_n = ''
erg = ""
for i in cast_e:
if i not in cast_n:
cast_n += i
for i in cast_e:
if i in cast_n:
erg += str(cast_n.index(i))
return erg
def prf_cast(ein1, ein2):
if cast(ein1) == cast(ein2):
print(ein1, ein2, "haben das gleiche Muster")
else:
print("Kein gleiches Muster für", ein1, ein2)
def main():
prf_cast("ABBA", "OTTO")
prf_cast("PAPER", "TITLE")
prf_cast("EGG", "ADD")
prf_cast("BADC", "BABA")
prf_cast("BBBAAABA", "AAABBBBA ")
if __name__ == '__main__':
main()
def ist_isomorph(s1,s2) :
if len(s1) != len(s2):
return False
return [len(set(s1)),len(set(s2))] == 2 * [len(set(zip(s1,s2)))]
beispiele = [('ABBA', 'OTTO'), ('PAPER', 'TITLE'), ('EGG', 'ADD'), ('BADC', 'BABA'), ('BBBAAABA', 'AAABBBBA')]
for s1, s2 in beispiele:
print('s1 = {}; s2 = {} => {}'.format(s1, s2, ist_isomorph(s1, s2)))
def analyze_pattern(input_string):
char_dict = {}
for i in range(len(input_string)):
char = input_string[i]
if char not in char_dict:
char_dict[char] = [i]
else:
char_dict[char].append(i)
return [char_dict[char] for char in char_dict]
def compare_pattern(str1, str2):
if len(str1) != len(str2):
return False
else:
return analyze_pattern(str1) == analyze_pattern(str2)
# Test
a, b = "PAPER", "title"
c, d = "badc", "BABA"
e, f = "dolle sache oder?", "7/{{#?f@.,#?/7#§$"
print(compare_pattern(a, b))
print(compare_pattern(c, d))
print(compare_pattern(e, f))
def in_zahlenmuster(s):
m = ''
muster = ''
for i in s:
if i not in m:
m += i
if i in m:
muster += str(m.index(i))
#print(muster)
return muster
def ist_isomorph(s1, s2):
if in_zahlenmuster(s1) == in_zahlenmuster(s2):
return True
return False
beispiele = [("ABBA", "OTTO"),
("PAPER", "TITLE"),
("EGG", "ADD"),
("BADC", "BABA"),
("BBBAAABA", "AAABBBBA ")]
for s1, s2 in beispiele:
print('s1 = {}; s2 = {} => {}'.format(s1, s2, ist_isomorph(s1, s2)))
