1

C#で実装された次の2つのメソッドがあります

private static string FindLongestPalindrome(string s) 
{
    string largest = "";

    for (int i = 1; i < s.Length-1; i++)
    {
        for (int j = i+1; j <= s.Length; j++)
        {
            if (IsPalindrome(s.Substring(i, j)))
            {
                largest = s.Substring(i, j);
            }
        }
    }

    return largest;
}

private static bool IsPalindrome(string s)
{
    bool isPalindrome = true;
    int j = s.Length-1;

    for (int i = 0; i < s.Length; i++)
    {
        if (s[i].ToString().ToLower() != s[j].ToString().ToLower())
        {
            isPalindrome = false;
            break;
        }

        j--;
    }

    return isPalindrome;
}

IsPalindrome文字列が回文かどうかをチェックFindLongestPalindromeし、文字列内で最も長い回文を見つけます。はい、私FindLongestPalindromeはそれが最も効率的ではなく、二次であることを認識しています。ただ、現時点では気にしていません。次の時点で、プログラムが境界を超えて例外をスローし続ける理由を知りたいだけです。

if (IsPalindrome(s.Substring(i, j))) {...}

すべての文字列入力に対してコードが範囲外にならないように、この部分を変更するにはどうすればよいですか?

4

3 に答える 3

2

これは次の理由によるものです。

for (int j = i+1; j <= s.Length; j++)

そのはず :

for (int j = i+1; j < s.Length; j++)
于 2013-11-15T03:27:19.107 に答える
1

c# は c++ ではありませんか....

   public static bool IsPalindrome(string s)
   {
      return s == new string(s.Reverse().ToArray());
   }

提案、これを文字列の拡張メソッドとして追加します

public static class StringSupport
{
    public static bool IsPalindrome(this string s)
    {
        return s == new string(s.Reverse().ToArray());
    }
}

このように使用するため

bool palindrome = "string".IsPalindrome();
于 2013-11-15T03:33:21.533 に答える
1

問題は、部分文字列から取得しようとしている文字が多すぎることです。

for ループ:

for (int j = i+1; j <= s.Length; j++)

次のようにする必要があります。

for (int j = i; j <= s.Length - i; j++)

に注意してs.Length - iください。

あなたの次の行:

if (IsPalindrome(s.Substring(i, j)))

最初のコードで失敗するのは、 is の場合、i最終2的に request:s.Substring(2, s.Length)になり、文字列に残っているよりも多くの文字を取得しようとするためです。本当に、(私が思うに) 文字列の残りを取得したかったのですが、そのままにしておくか、そのインデックスから開始して文字列の残りを取得するオーバーロードを使用することができます。String.Substring(int)編集:いいえ、申し訳ありませんが、これは悪い考えであり、いくつかのテストでは失敗します。

残念ながら、コードには他にもいくつかのバグがあります。たとえば、「banana」は「anana」ではなく「ana」を返します。さらに、最も長い回文が入力の最初の文字で始まる場合、それは無視されます ( i = 10 ではなく で始まるため) 修正バージョンは次のとおりです。

private static string FindLongestPalindrome(string s) 
{
    string largest = "";

    //start at i = 0 instead
    //Also needs to be to i < s.Length or fails some tests
    for (int i = 0; i < s.Length; i++)
    {
        for (int j = i; j <= s.Length-i; j++)
        {
            string substring = s.Substring(i, j);

            //you also need to check that you're looking at a longer string
            //this really could be optimized anyway, but here it is for simplicity
            if (substring.Length > largest.Length && IsPalindrome(substring))
            {
                largest = substring;
            }
        }
    }

    return largest;
}

これにより、いくつかのテスト:

banana --> anana
bananab --> bananab
zzz --> zzz
abcdddeeedddc --> cdddeeedddc
a --> a
abcbabbbbbbab --> babbbbbbab
于 2013-11-15T03:54:42.747 に答える