2012-01-05 20 views
0

Ruby Game challengesのうちの1つでは、指定された文字列の中で最長の回文部分文字列を探すように求められますので、abacdfgdcabaypqqpyからypqqpyを抽出する必要があります。このコードスニペットは、文字列からパリンドローム部分文字列をどのように見つけますか?

w = string.size 
l = (w.to_f/2).ceil 
l.upto(w-1) do |j| 
    i = w-j 
    l.upto(w-i+1) do |n| 
    s = string[n,i] 
    return s if s == s.reverse 
    end 
end 

、誰もがそれがどのように機能するかについて簡単に説明を与えることを気になります[正規表現を使用していません]与えられた応募作品の一つが、このでしたか?

P.Sこれは有効な質問ですか?

+0

問題は、このコードは* *正しくない、です。これは '' addaabcd''のような入力に失敗します。ここでは、回文は前半にあります。それを説明することはできませんが、必要ならば、正規表現なしで動作するいくつかのコードを一緒に解読して、説明を付けることができます。 –

答えて

4

これは有効な解決策ではありません。例えば、入力"addaabcd"(または単語の前半にあるパリンドロームの文字列)で失敗します。 (非常に効率的ではないが)明らかな解決策は次のようになります。

# iterate over possible palindrom lengths 
# (in descending order) 
string.size.downto(0) do |n| 
    # iterate over possible palindrome locations 
    0.upto(string.size - n) do |i| 
    # extract the substring 
    s = string[i,n] 

    # is the substring a palindrome? 
    # If yes, we found our solution, because we know 
    # that no longer palindrome exists 
    return s if s == s.reverse 
    end 
end 
+0

正規表現は、文字列の前の短い末字に含まれる文字で始まる回文を見つけることができません。例: '' ppop "=>" pp "' –

+0

@ラス:いいキャッチ!ポイントは、回文の言語は規則的ではありませんが、多くの言語で正規表現と一致する可能性がありました。しかし、これは悪い例のようです:) –

-1

一つの可能​​な解決策

str = "addaabcdaddadcba" 
length = str.size 

all = [] # contains all possible palindromes of the string 

0.upto(length - 2) do |start| 
    (start+1).upto(length - 1) do |finish| 
    check_str = str[start,finish] # check each possible substring 
    next if finish - start == 1 # ignore single letter strings 
    all.push(check_str) if check_str == check_str.reverse # if the string and its reverse are equal then it is a palindrome 
    end 
end 

p all.max_by(&:size) 
+1

さらに、このコードにはエラーがあります。str [start..finish]ではなくstr [start、finish]でなければなりません。 。 –

関連する問題