C# 继续越界

C# 继续越界,c#,loops,indexoutofboundsexception,C#,Loops,Indexoutofboundsexception,我用C实现了以下两种方法# 如何修改此部分,使代码不会超出每个字符串输入的界限?这是因为: for (int j = i+1; j <= s.Length; j++) for(int j=i+1;j这是因为: for (int j = i+1; j <= s.Length; j++) >(int j= i+1;j<p>c为c,不为C++…< /p>) public static bool IsPalindrome(string s) { return s

我用C实现了以下两种方法#


如何修改此部分,使代码不会超出每个字符串输入的界限?

这是因为:

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

for(int j=i+1;j这是因为:

for (int j = i+1; j <= s.Length; j++)
<代码> >(int j= i+1;j<p>c为c,不为C++…< /p>)
   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();

是C不为C++…< /P>

   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();

您的问题是试图从子字符串中检索太多字符

您的for循环:

for (int j = i+1; j <= s.Length; j++)
第一个代码将失败,因为如果
i
2
,您最终会请求:
s.Substring(2,s.Length)
,它将尝试检索比字符串中剩余字符更多的字符。真的,您想要(我想)要获取字符串的其余部分,可以保持原样,或者只使用从该索引开始并获取字符串其余部分的

不幸的是,您的代码中还有一些其他错误。例如,“香蕉”返回“ana”而不是“anana”。此外,如果最长回文以输入的第一个字母开头,它会忽略它(因为您从
i=1
开始,而不是从0开始),这里有一个固定版本:

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;
}

您的问题是试图从子字符串中检索太多字符

您的for循环:

for (int j = i+1; j <= s.Length; j++)
第一个代码将失败,因为如果
i
2
,您最终会请求:
s.Substring(2,s.Length)
,它将尝试检索比字符串中剩余字符更多的字符。真的,您想要(我想)要获取字符串的其余部分,可以保持原样,或者只使用从该索引开始并获取字符串其余部分的

不幸的是,您的代码中还有一些其他错误。例如,“香蕉”返回“ana”而不是“anana”。此外,如果最长回文以输入的第一个字母开头,它会忽略它(因为您从
i=1
开始,而不是从0开始),这里有一个固定版本:

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;
}


嗯,我不太确定。我只是复制/粘贴了代码,但仍然出错。我想这是因为
子字符串
调用。它最终尝试访问太多字符。例如
I
is
2
,在您的代码更新后,它将尝试放入
子字符串(2,s.长度-1)
这将出错。如果您输入
j
它不再出错,但也不会返回实际最长的回文(它返回的是回文,只是对我来说不是最长的。例如,“香蕉”返回“nan”而不是“anana”)简单地删除等号并不能解决问题。仍然会出现异常。@Zolt你能举一个输入的例子吗?我的输入是
abaccdccefe
Hmm,我不太确定。我只是复制/粘贴了代码,但仍然出错。我想这是因为
子字符串
调用。它最终试图访问太多字符。比如说
i
2
,随着代码更新,它将尝试放入
子字符串(2,s.Length-1)
,这将出错。如果放入
j
它将不再出错,但也不会返回实际的最长回文(它返回的是回文,只是对我来说不是最长的。例如,“香蕉”返回“nan”而不是“anana”)简单地删除等号并不能解决问题。仍然会出现异常。@Zolt您能给出一个输入示例吗?我的输入是
abaccdccefe
您的第二个for循环代码帮助我修复了错误。但是,您的新方法实现存在问题。它不适用于
abaccdccefe
@Zolt:很抱歉hat.我把我关于
s.Substring(I)
如何在你的算法中使用的想法搞糟了。如果你把它放回你原来的
s.Substring(I,j)
它可以工作。您的第二个for循环代码帮助我修复了错误。但是,您的新方法实现存在问题。它不适用于
abaccdccefe
@Zolt:很抱歉。我在如何
s.Substring(I)的问题上思路混乱
正在您的算法中使用。如果您将它放回原始的
s.Substring(i,j)
它可以工作。我非常喜欢您对
isAlindrome
的实现。它可以工作,但我不知道为什么。我真的很想知道。您能解释一下这一行在做什么吗?
返回s==新字符串(s.Reverse().ToArray())
事实上,现在我更仔细地看了看您的代码,它非常有意义。您返回原始字符串和反转字符串之间比较的真值。我现在很好,谢谢。代码在字符数组中反转字符串,并在创建新字符串进行比较后,很容易理解:)我真的很喜欢你的
isAlindrome
实现。它可以工作,但我不知道为什么。我真的很想知道。你能解释一下这行的作用吗?
返回s==新字符串(s.Reverse().ToArray())
事实上,现在我更仔细地看了看您的代码,它非常有意义。您返回原始字符串和反转字符串之间比较的真值。我现在很好,谢谢。代码在字符数组中反转字符串,并在创建新字符串进行比较后,很容易理解:)