これはpython質問です。答えはO(n)時間の複雑さであり、追加のメモリを使用しないでください。入力として、分類されるべき文字列を取得しますパリンドロームか否か(パリンドロームは、単語または左から右、右から左に同じように読むことができる語句、fe "レベル"です。入力では、句読点や単語間のギャップがあります。たとえば、 " I.した、、、しましたか?????」主な目的は、入力が回文かどうかを決定することです。
この質問を解決しようとしたとき、いくつかの課題に直面しました。文字以外の数字を削除しようとすると
for element in string:
if ord(element) not in range(97, 122):
string.remove(element)
if ord(element) == 32:
string.remove(element)
O(n ^ 2)の複雑さを使用します。これは、文字列のすべての要素に対して、それ自体がO(n)複雑さを持つ削除関数を使用するため、nはリストの長さです。 O(n)複雑さで文字以外の文字を削除することでパーツを最適化する助けが必要
また、スペースを句読点として取り除くと、Wordが回文かどうかを確認する方法がわかりますが、私の方法では追加のメモリを使用します。
Word = input('Input your Word: ')
Word1 = ''
for l in Word:
if l.isalnum():
Word1 += l
Word2=''
for index in sorted(range(len(Word1)),reverse=True):
Word2+=Word1[index]
if Word1 == Word2:
print('It is a palindrone.')
else:
print('It is not a palindrone.')
代入式 構文(Python 3.8+)を使用したワンライナーは次のとおりです。
_>>> s = "I. did,,, did I????"
>>> (n := [c.lower() for c in s if c.isalpha()]) == n[::-1]
True
_
私は主にデモとして上記を示しました。読みやすさのために、私はSimonRのソリューションのようなものをお勧めします(ただし、_ascii_letters
_と比較してisalpha
をまだ使用しています)。
または、 ジェネレータ式 を使用して、O(n)
追加メモリを割り当てずに同じ比較を行うことができます。
_def is_palindrome(s):
forward = (c.lower() for c in s if c.isalpha())
back = (c.lower() for c in reversed(s) if c.isalpha())
return all(a == b for a, b in Zip(forward, back))
_
Zip
はまだPython 2に割り当てられていることに注意してください。そこでは_itertools.izip
_を使用する必要があります。