web-dev-qa-db-ja.com

文字列が回文かどうかの判断

これは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が回文かどうかを確認する方法がわかりますが、私の方法では追加のメモリを使用します。

3
vnikonov_63

これは役立ちますか:

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.')
0
Ann Zen

代入式 構文(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_を使用する必要があります。

0
tzaman