有效括号 python/Java

目录

题目要求

实现思路

代码展示

代码讲解

python版本

总结


题目要求

括号匹配问题是leetcode上的一篇难度级别为简单的算法题,这原本是栈的拿手好戏,但是我们今天讲的思路简单粗暴,并会绕开栈的使用,直接利用数组暴力得到了正确的答案,因此时间复杂度相对于使用栈的方法要高出许多。注意,该方法仅仅是解决括号匹配问题中思路最简单的一个,而不是最优的。

我们来看一下括号匹配这个问题都有什么要求:1.左括号需要和相同类型的右括号闭合2.空字符串也是有效的 3.没有落单的括号。举几个例子:(格式为:输入->输出;)

"{"->false;

"([}"->false;   

"()]"->false;   

"()"->true;   

"[()]{}"->true;

""->true


实现思路

既然目标字符串中只有括号,而且要求括号必须闭合不能落单,我们就想到了一种简单的思路:如果检测到了成对的括号,我们将其删掉,直到字符串中不在包含这种有效且成对的括号。如果字符串是有效的,那么在所有合法的括号被删除之后剩下的应该是空字符串才对。如果非空,就说明有不合法的括号或其他东西混在字符串里面,因此我们返回false,反之则返回true。


代码展示

package advance.algorithm;
 
public class IsValidBracket {
	public boolean solution(String s) {
		String[] arr= {"()","[]","{}"};
		while (s.contains(arr[0]) || s.contains(arr[1]) || s.contains(arr[2])){
			s=s.replace(arr[0], "");
			s=s.replace(arr[1], "");
			s=s.replace(arr[2], "");
		}
		return s.equals("");
	}
	
	public static void main(String[] args) {
		IsValidBracket obj=new IsValidBracket();
		String str="[{]";
		System.out.println(obj.solution(str));
		
	}
}

代码讲解

由于我是用的是eclipse,第一行需要声明该程序在哪个包下。我们开始讲代码。arr存储了所有合法的闭合括号,因而我们可以在while循环条件判断中使用contains()方法判断字符串中是否包含了arr中的任意元素。一旦包含,就执行while循环内的代码。replace(a,b)函数就是一替换,并返回替换后的字符串。他的第一个参数a是被替换的对象,第二个b是要替换成的对象,这里第二个参数为空字符串——其实就是实现了删除合法括号的效果。

在不满足while循环条件后,我们用java.lang.String中内置的equals()方法判断此时的字符串是否为空,并返回一个布尔值(为空则返回true,反之false)。如果不为空,说明字符串中有不合法的元素——毕竟合法的都被删掉了,剩下的只能是一些毫不相干的阿猫阿狗。、

这样我们就解决了了括号匹配这道题


python版本

def isvalid(s):
    lst = ["()","[]","{}"]
    while any(i in s for i in lst):
        for i in lst:
            s=s.replace(i,"")
    return s==""

string="{{[]}}"
print(isvalid(string))
#运行结果:True

 python版本显然看起来简洁了不少,虽然作为一个算法他还比较糟糕,但是至少实现简单且看起来令人心旷神怡。我们来看一下代码。any(element in x for element in y) 这函数就是判断在列表y中是否存在元素element,可以在指定的序列x中找到值。若可以,则返回true,即进入while循环。接下来是遍历列表。若元素存在于字符串中,replace()函数就会自动用空字符串代替该元素,相当于是实现了删除的效果。最后再来一个判断字符串s中是否为空,空就说明该字符串中没有包含其他不合法括号,返回true,也倒合乎其理。


总结

如果大家实在想不出或理解不了栈的方法,这种取巧的方法是可以用的,但是他毕竟不是好的算法,只能保证题目可以解出来。在工作中,我们最好是找到效率最高的算法,这样才能更高效的利用电脑资源,毕竟这种能在项目中用到很多次的小算法,效率哪怕是提升1%都是巨大突破,使计算机能用相同的资源干更多的事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值