如何修复我的代码,以便找到有效的(){} []?现在,它只返回true。
public static boolean isValid(String s){
HashMap<Character, Character> specialChar= new HashMap<>();
specialChar.put('{', '}');
specialChar.put('[',']');
specialChar.put('(',')');
Stack<Character> stk = new Stack<>();
for (int i=0; i<s.length(); i++){
if (specialChar.keySet().contains(s.charAt(i))){
stk.push(s.charAt(i));
}
else if (specialChar.values().contains(s.charAt(i))){
if (!stk.empty()) {
stk.pop();
}
}
}
return stk.isEmpty();
}
System.out.println(isValid("{}{lll}]"));
答案 0 :(得分:5)
我在一段时间内制作了这个方法,因为它是关于codewars.com的问题
您有4个条件需要返回false
。
Stack
的大括号
)
中关闭Character
和顶部Stack
不是(
}
中关闭Character
和顶部Stack
不是{
]
中关闭Character
和顶部Stack
不是[
public static boolean isValid(String s) {
System.out.println(s);
Stack<Character> st = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch == '(' || ch == '{' || ch == '[') {
st.push(ch);
} else if (ch == ')' || ch == '}' || ch == ']') {
if (st.isEmpty()) {
return false;
}
char topChar = st.pop();
if (ch == ')' && topChar != '(') {
return false;
}
if (ch == '}' && topChar != '{') {
return false;
}
if (ch == ']' && topChar != '[') {
return false;
}
}
}
return st.isEmpty();
}
正在运行
System.out.println(isValid("{}{lll}]"));
收益率:
{} {LLL}]
假
答案 1 :(得分:2)
这似乎是一个面试问题,或者确实如此,回到我初次面试的时候。
您确实拥有固定大小的括号类型 - 三个[]
,{}
,()
,因此它足以为每个类型保留三个计数器,例如indexers
,curlies
和normals
。在开始时,它们被标准化 - 每个0
。
然后用char遍历字符串char。对于每个字符,检查括号类型并增加相应的计数器(如果它是开放的计数器),如果它是关闭计数器则递减。一旦你到达一个负面的计数器,这意味着你已经达到一个结束的计数器,在它们被标准化后,让我们说{} {} }
,所以你只需要返回false
。这是一个无法恢复的错误,您无法打开已经关闭的括号。
while (indexers >= 0 && curlies >= 0 && normals >= 0) {
if (char == '}') curlies--;
if (char == '{') curlies++
if (char == ')') normals--;
// ...
}
主要观点是在循环结束后,所有计数器都为零: - )
答案 2 :(得分:0)
sudo sed "s/192[^:]\+ /192.168.56.109/" file
随时提供反馈,评论等!
答案 3 :(得分:0)
/**
* Validate if there balanced brackets in String
*
* @param s is the string to be validated
* @return true, if is valid
*/
public static boolean isValid(String s)
{
/* wrong use of map (because you never said "get value of this key") here,
* may be you can create two Set here
*/
Map<Character, Character> specialChar= new HashMap<Character, Character>(3);
specialChar.put('{','}');
specialChar.put('[',']');
specialChar.put('(',')');
Stack<Character> stk = new Stack<Character>();
for (int i=0; i<s.length(); i++)
{
char c=s.charAt(i);
if (specialChar.keySet().contains(c))
{
stk.push(s.charAt(i));
}
else if (specialChar.values().contains(c))
{
//use equals(),should not use use ==, which works but not right way to do
if (stk.isEmpty() || stk.pop().equals(c))
{
return false;
}
}
}
return stk.isEmpty();
}