提供了一个字符串,我的目标是检查是否可以在重新排列字符后使该字符串成为回文字符串。
例如:aaabbbb
可以通过改为:bbaaabb
所以我尝试的是将字符串的所有排列与其反向进行比较,如果存在则打印为YES! 。到目前为止,这是代码:
private static void permutation(String prefix, String str)
{
temp.setLength(0); //temp is a StringBuilder
int n = str.length();
if((n==0) && (str.charAt(0)==str.charAt(n-1)))
{
temp.append(prefix);
temp.reverse();
if(prefix.equals(temp.toString()))
{
System.out.println("YES");
System.exit(0);
}
}
else
{
for(int i=0;i<n;i++)
permutation(prefix+str.charAt(i),str.substring(0,i)+str.substring(i+1,n));
}
}
现在问题是,在运行时我在这一行得到 java.lang.StringIndexOutOfBoundsException :permutation(prefix+str.charAt(i),str.substring(0,i)+str.substring(i+1,n));
可能导致这种情况的原因是什么?
答案 0 :(得分:1)
我不打算为你调试这个,但我会建议一个如何调试这种事情的过程。
确定问题。关于回文的所有细节都是无关紧要的。在调用String上的一个方法时问题是java.lang.StringIndexOutOfBoundsException
。
缩小确切的失败。行中有几个方法调用失败。如果不明显哪个方法调用是问题,可以使用调试器单步执行,也可以将该行分成几行,例如:通过创建中间变量来保持中间状态。
以简化示例重现问题。使用main()
方法创建新类,或编写单元测试并编写显示问题的代码。删除对显示问题绝对不重要的所有内容。
修复您的示例。一旦您将问题与阅读文档隔离开来,可能很明显如何修复它。如果不是,并且您仍然陷入困境,请在Stack Overflow上发布简单示例并说明您的期望以及您将获得的内容。
修复您的代码。将相同的修补程序应用于原始代码。
答案 1 :(得分:0)
这一行也会给你一个例外:
if((n==0) && (str.charAt(0)==str.charAt(n-1)))
如果n == 0则字符串为空,charAt(0)将失败。不确定你在这里测试的是什么。
答案 2 :(得分:0)
String index out of bound exception
- String类的方法抛出此异常,以指示索引是否为负数,或者大于字符串本身的大小。
在上面的代码中,您递归地调用permutation()
方法。
我们假设我们第一次将String str="xy"
和前缀""
传递给permutation()
方法。
当它的长度大于0时,它将进入else
块。
在else块中,我们使用其长度循环str
。
这里的长度是n is 2
。
在第一个循环中,i=0
。因此prefix + str.charAt(i)
会"" + "x" = "x"
和str.substring(0,i)+str.substring(i+1,n)
将给str.substring(0,0)+str.substring(0+1,2)=""+"y"="y"
。
现在我们再次将这些值传递给permutation()
方法;即permutation("x","y")
。
因此,当您在方法中传递这些值时,当时字符串str
立即成为"y"
,字符串前缀变为"x"
但是你仍处于循环中,在第二个循环中i=1
和prefix+str.charAt(1)
,即"x"+"y".charAt(1)
将抛出异常。
在这里,您可以看到字符串str="y"
,长度为1,我们正在尝试在位置1处获取字符。这就是您遇到此异常的原因。