2016-12-07 4 views
2

私はこのサイトと他のものを見て、Python上の文字列を反復する方法を調べました。特定の部分文字列を見つけて逆にして、 Palindromeを取得します。これは問題ですが、テストケースの中には挑戦しているものがあり、インデックスを作成して見つける方法がわかりません。Pythonパインドロムを探すために文字列を反復する

は、これはすべてのために働く私のコードですが、2つのテスト・ケース:

def countPalindromes(s): 
    count = 0 
    firstindex = 0 
    lastindex = len(str)-1 
    while firstindex != lastindex and firstindex <= lastindex: 
     ch1 = s[firstindex:lastindex] 
     ch2 = s[lastindex:firstindex:-1] 
     if ch1 == ch2: 
      count +=1 
     firstindex +=1 
     lastindex -=1 
    return count 

このコードは、次の回文の作品:「レースカー」、「」、および「abqcを」。 これらのPalindromes "aaaa"と "abacccaba"では動作しません。

「aaaa」には6つのパリンドロームがあり、「abacccaba」には8つのパリドロームがあります。これは私の問題が発生する場所で、私はそれを理解できません。 "aaaa"のための6つのパリドロームのために、私はaaaa、aaa、aaをそれぞれ2回得る。 "abacccaba"には8つの回文がありますが、私はabacccaba、bacccab、accca、ccc、aba、abaを取得しました。

私はこれが混乱しやすい質問だと理解していますが、「aaaa」は2、「abacccaba」は4つしかないため、問題に近づく方法は失われています。どのように私は部分文字列を切り捨てて、これらの値を取得する任意のアイデアですか?

ありがとうございます!

答えて

1

while firstindex != lastindex and firstindex <= lastindex:は、単一文字のパリンドロームの場合がありません。

aaには3つのパリドローム、0:1,0,0:2,1:2が含まれている場合もあります。

私はaaaaのためにいくつかの回文が欠けていると思います。 10があります。

aaaa 
a 
a 
    a 
    a 
aa 
aa 
    aa 
aaa 
aaa 

単一文字の回文はカウントされません場合は、我々が持っている6

いずれかの方法、あなたは可能回文など、すべてのサブストリングを検討する必要があります。真ん中にあるものだけではありません。文字列をその逆の自己と比較することは、Pythonでは非常に簡単です:s == s[::-1]

Getting all the substrings is easy too

len([a for a in get_all_substrings(string) if len(a) > 1 and a == a[::-1]]) 
+0

だから私はいくつかの合計が不足していることに気づいた唯一の人ではない。私は彼らが2よりも大きくなければならないと言及するべきだったが、まだいくらか欠けている。残念ながら、これはコードランナーのものの1つで、期待される出力が必要なものです。私はあなたが提供したものを見て、テストケースを正しく得るためにそれを回避しようと思います! –

+0

もう1つのこと: 'while firstindex!= lastindexとfirstindex <= lastindex:'は '' firstindex

+0

ああ、感謝します! –

0

は、私はあなたを思う:

substrings = [a for a in get_all_substrings(string) if len(a) > 1] 

が、これらはかなりまっすぐ進むべきである組み合わせ:

def get_all_substrings(input_string): 
    length = len(input_string) 
    return [input_string[i:j+1] for i in range(length) for j in range(i,length)] 

と長さ< 2の文字列をフィルタリングも簡単です。文字列が回文かどうかを調べるために関数(f)を個別に書くべきです。

次に、文字のサブストリングを選択する関数(g)を作成します。

例:文字列abcdで、gはa、b、c、d、ab、bc、cd、abc、bcd、abcdを選択します。その後、これらの文字列のそれぞれにfを適用して、回文の数を取得します。

関連する問題