给出一个仅包含字符')'
,'{'
,'}'
,'['
,']'
和Input: "()[]{}"
Output: true
Example 2:
的字符串,确定输入是否字符串有效。
在以下情况下,输入字符串有效:
示例1:
Input: "{[(])}"
Output: false
示例2:
static boolean isPair(char left,char right){
return left=='{' && right=='}' || left=='(' && right==')' || left=='[' && right==']';
}
public boolean isValid(String s) {
Stack<Character> stack= new Stack<>();
for(char ch: s.toCharArray()){
if(ch=='(' || ch=='{' || ch=='['){
stack.push(ch);
}
else{
if(!stack.isEmpty() && isPair(stack.peek(),ch))
stack.pop();
else
return false;
}
}
return stack.isEmpty();
}
我针对上述问题的解决方案是:
public boolean isValid(String s) {
Stack<Character> stack= new Stack<>();
for(char ch: s.toCharArray()){
if(ch=='(')
stack.push(')');
else if(ch=='{')
stack.push('}');
else if(ch=='[')
stack.push(']');
else if(stack.isEmpty() || stack.pop()!=ch)
return false;
}
return stack.isEmpty();
}
我在某处找到了一个更智能的解决方案,但无法理解。 这是代码:
else-if
请帮助我了解最后$imgPath = "\images\Progressiva_Itaipu.jpg";
$cid = md5($imgPath);
$mail->AddEmbeddedImage($imgPath,$cid,'Progressiva_Itaipu.jpg');
块的工作原理。
答案 0 :(得分:2)
您已将closing bracket
的所有括号都推入opening
。因此,当右括号出现时,它将匹配堆栈顶部的字符。如果不匹配或堆栈变为空。这意味着不平衡。
else if(stack.isEmpty() || stack.pop()!=ch)
return false;
到达此处时,您有一个bracket
作为ch,但是堆栈为空,或者堆栈中的值与传入的字符不匹配。
因此,这些寄生虫不平衡。
答案 1 :(得分:0)
它实际上与您自己的版本非常相似。
主要区别在于,将方括号推入堆栈,然后在public static void Main(string[] args)
{
CreateWebHostBuilder(args)
.ConfigureLogging(context =>
{
// define additional logging providers
// get environment via `context.HostingEnvironment`
}).Build().Run();
中检查堆栈顶部的方括号是否与您当前正在评估的结束括号相符。
该解决方案通过将预期的右方括号直接推入堆栈来跳过它,但是在功能上是相同的。
最后一个isPair
与您的if else
完全相同:
else
返回false 在情况2中,解决方案会弹出堆栈,而在您的情况下您不会弹出堆栈,这有一点差异。但是随着函数的返回它不会改变任何东西,并且该堆栈将不再使用。