解决问题:Java中的有效括号字符串
我正在尝试从LeetCode实现以下程序 给定仅包含字符“(”、“)”、“{”、“}”、“[”和“]”的字符串s,确定输入字符串是否有效。 输入字符串在以下情况下有效:解决问题:Java中的有效括号字符串,java,Java,我正在尝试从LeetCode实现以下程序 给定仅包含字符“(”、“)”、“{”、“}”、“[”和“]”的字符串s,确定输入字符串是否有效。 输入字符串在以下情况下有效: 开放式括号必须由相同类型的括号封闭 必须按照正确的顺序关闭开放式支架 我已经编写了以下代码。它可以运行86/91个测试用例。为了让所有的测试用例都运行,我应该在代码中更改什么 class Solution { public boolean isValid(String s) { char a[] = n
class Solution {
public boolean isValid(String s) {
char a[] = new char[10000];
int j=0, flag = 0;
char pop='a';
for(int i = 0 ; i<s.length() ; i++)
{
if(s.charAt(0)=='(' || s.charAt(0)=='[' || s.charAt(0)=='{')
{
}
else
{
return false;
}
if(s.length()%2==0)
{
}
else
{
return false;
}
if(s.charAt(i)=='(' || s.charAt(i)=='[' || s.charAt(i)=='{')
{
if(j<0)
{
j=0;
}
a[j]=s.charAt(i);
j++;
}
else if(s.charAt(i)==')' || s.charAt(i)==']' || s.charAt(i)=='}')
{
try
{
pop = a[j-1];
}
catch(Exception e)
{
}
j=j-2;
if(s.charAt(i)==')')
{
if(pop=='(')
{
flag=1;
}
}
else if(s.charAt(i)==']')
{
if(pop=='[')
{
flag=1;
}
}
else if(s.charAt(i)=='}')
{
if(pop=='{')
{
flag=1;
}
}
if(flag == 1)
{
}
else
{
return false;
}
}
}
if(j<0)
{
return true;
}
else
{
return false;
}
}
}
类解决方案{
公共布尔值无效(字符串s){
字符a[]=新字符[10000];
int j=0,flag=0;
charpop='a';
对于(inti=0;i,正如@Koenigsberg在他的文章中所说的,使用a来实现解决方案似乎是合适的
import java.util.EmptyStackException;
导入java.util.Stack;
公共类解决方案{
私有静态最终字符CURLY='{';
私有静态最终字符CURLY_CLOSE='}';
私有静态最终字符轮='(';
private static final char ROUND_CLOSE=');
私有静态最终字符平方='[';
私有静态最终字符平方_CLOSE=']';
私有静态布尔isCloser(字符开启器、字符关闭器){
返回开关(开启器){
case CURLY->closer==CURLY\u CLOSE;
案例圆形->闭合==圆形\闭合;
方格->闭合==方格\闭合;
默认->假;
};
}
私有静态布尔等参元(char-ch){
返回ch==卷曲| | ch==圆形| | ch==正方形;
}
私有静态布尔值isValid(字符串输入){
布尔有效=真;
堆栈=新堆栈();
对于(int i=0;i
请注意,上述代码中的方法isCloser
,使用了JDK12中引入的方法
运行上述代码将生成以下输出:
true:()
true:()[]{}
错:(]
错:([)]
真:{[]}
false:({{{}}}))
编辑
根据OP在下面a中的要求,这里是char
s堆栈的实现。只需将上述代码中的stack
替换为CharStak
class CharStak{
专用静态最终整数大小=100;
私有字符[]字符;
私人整数计数;
公共CharStak(){
charr=新字符[大小];
}
公共布尔空(){
返回计数==0;
}
公共字符peek(){
checkEmpty();
返回字符[计数-1];
}
公共字符pop(){
checkEmpty();
返回字符[--count];
}
公共无效推送(char ch){
charr[count++]=ch;
}
私有void checkEmpty(){
if(空()){
抛出新的EmptyStackException();
}
}
}
Unrelated:如果你把你的保护检查转过来,你的代码就更容易阅读了。意思是:不要用“if X then nothing return false”,而是用“if!X then return false”。你也可以把所有有效字符分为两组(一组用于打开,一组用于关闭括号)。绝对要避免的事情是:有空的catch块。你的“pop”很可能会导致一个异常,然后被完全忽略。永远不要这样做。至少要打印异常,尤其是在不应该抛出的代码中,让它们发生,然后修复它们!j=j-2
对于“pop”来说似乎是非常错误的操作。当将一个字符推到堆栈上时,将一个字符添加到j
;当弹出一个后退时,为什么不减去一个呢?我觉得这可能是堆栈的完美方案。因此,每推一个左括号向前一步,但每弹出一个右括号向后两步?这没有意义。谢谢s、 我使用了一个数组来实现堆栈。你能再次查看我的解决方案吗?@AnwesaRoy on leetcode也使用classjava.util.stack
。你是否试图实现自己的堆栈而牺牲了找到问题的有效解决方案?是的,我正在尝试使用数组来实现堆栈。该程序不会遇到任何问题任何“执行超时”执行它的测试用例的错误占测试用例的90%以上。因此,我猜可能会使用数组来解决此问题。@AnwesaRoy我不打算调试您的代码,有调试程序。每个程序员都需要学习如何调试代码。您的IDE应该有一个调试程序。学习如何使用它。您能告诉我“({{}}}}”)吗是否为有效字符串?.LeetCode将“({{{}}}”)显示为无效字符串。谢谢。