我有一串字符As,Bs和Cs,我需要分析语言(ABC)^ n,其中n> 0。如果这个字符串是" ABCABCABC"这是真的,如果它是" ABAB"或" AB"这不是真的。当它读取一行" AB"时,我不断收到错误消息字符串索引的界限。然后它会停止程序。 这是我的代码:
public boolean isABC(String line) throws StackException{
MyStack Stack = new MyStack();
// initialize loop counters
int i = 0;
int n = line.length();
char ch = line.charAt(i);
// Push all 'A's to L6Stack
while (i < line.length()){
if(line.charAt(i) == 'A'){
L6Stack.push(ch);
i++;
if(line.charAt(i)=='B'){
L6Stack.push(ch);
i++;
if(line.charAt(i) =='C'){
L6Stack.push(ch);
i++;
}else
break;
}else
break;
}else
break;
}
if (i == n ){
return true;
}else
return false;
}
答案 0 :(得分:4)
您的代码尝试前进3个字符,然后检查是否可以在不超出边界的情况下执行此操作。您可以使用i++
替换所有if (i==n) return false; i++
来解决此问题。但是,您也可以将其全部重写为 lot 清洁工:
试试这个:
public boolean isABC(String line) {
int total = line.length();
int position = 0;
char prev = 'C';
while (position < total) {
char c = line.get(position++);
switch (c) {
case 'A': if (prev != 'C') return false; break;
case 'B': if (prev != 'A') return false; break;
case 'C': if (prev != 'B') return false; break;
}
prev = c;
}
return prev == 'C';
}
您也可以将它们全部添加到堆栈中,然后pop()
堆栈(所以char c = stack.pop()
,反转逻辑),但这个特定表达式实际上没有必要。
编辑:添加了基于堆栈的变体:
public boolean isABC(String line) {
// fill stack
Stack<Character> stack = new Stack<Character>();
for (int i=0; i<line.length(); i++) {
stack.push(line[i]);
}
// reverse operations while popping from stack
char prev = 'A';
while ( ! stack.isEmpty()) {
char c = stack.pop();
switch (c) {
case 'A': if (prev != 'B') return false; break;
case 'B': if (prev != 'C') return false; break;
case 'C': if (prev != 'A') return false; break;
}
prev = c;
}
return prev == 'A';
}
答案 1 :(得分:1)
如果字符串长度为2(&#34; AB&#34;),那么当你到达 p>时
if(line.charAt(i) =='C')
i
的值为2
。长度为2的字符串仅包含位置0
和1
的字符。如果你使用charAt(2)
,你试图超出字符串的结尾,导致异常。
现在,只要输入字符串长度不是3个字符的倍数,就会出现错误。
答案 2 :(得分:0)
我不打算纠正你的逻辑,但我会试着解释你为什么会得到SIOOB异常。请参阅内联评论。
让我们说吧
line =“AB”;
所以length = 2
和i = 0
while (i < line.length()){//this condition returns true.
if(line.charAt(i) == 'A'){// you are trying to access 0th Element.
L6Stack.push(ch);
i++;// i is 1 now.
if(line.charAt(i)=='B'){// trying to access 1st element.
L6Stack.push(ch);
i++;//i is 2 now.
if(line.charAt(i) =='C'){// trying to access 2st element. which would give you exception because there is no 2nd element.
L6Stack.push(ch);
i++;
}else
break;
}else
break;
}else
break;
}