C# 继续越界
我用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
如何修改此部分,使代码不会超出每个字符串输入的界限?这是因为:
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
is2
,在您的代码更新后,它将尝试放入子字符串(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())
事实上,现在我更仔细地看了看您的代码,它非常有意义。您返回原始字符串和反转字符串之间比较的真值。我现在很好,谢谢。代码在字符数组中反转字符串,并在创建新字符串进行比较后,很容易理解:)