LeetCode刷题——有效的括号

大家好,今天继续刷题日记,这道题是LeetCode里面字符串简单难度的第三道题,但是卡了我非常多的时间。首先是题目要求:


下面介绍一下思路:

我最开始的想法非常复杂,设了三个指针,一个指向string的头,一个指向string的尾,还有一个是变动指针,然后分段进行判断循环,最后运行出来超时了。后来受到启发,定义一个新的string,将原string的内容以栈的方式存储进新的string中。每读入一个新的字符就与前一个字符比较,看是否相差1或2。(()相差1,[]和{}相差2)如果相差1或2就看做配对成功,把最新读入的和它前一个字符一起消掉,如果不匹配就入栈。直到整个string读入完毕,看新定义的string是否为空,如果为空说明全部配对成功,返回true,如果还有残余的字符说明false。

下面上代码:

class Solution {
public:
    bool isValid(string s) {
	int j = 0;
	string temp;
	int len = s.size();
	temp += s[0];

	if (s[0] == '(' || s[0] == '[' || s[0] == '{'){
		for (int i = 1;i < len;i++){
			if ((s[i] == temp[j] + 1) || (s[i] == temp[j] + 2)){
				temp.erase (temp.end()-1);
				j--;
			}
			else {
				temp += s[i];
				j++;
			}
		}
		if (temp.empty())
			return true;
		else return false;
			
	}
	else{
	if (s  == "")
		return true;
	else return false;
	}
        
	}
};

下面做几点说明,是我通过这道题学到的东西:

1.string可以通过+=的形式读入字符,我以前都是以数组下标的形式来处理的,最近新学到了折中方法,觉得很方便,也算是string的特性吧。

2.可以通过string.begin()和string.end()来查找string的第一个和最后一个字符,注意string.end()是string最后一个字符的后一位,因此要查找最后一个字符应该是string.end() - 1。我当时要查找最后一位字符,百度到的很多方法都是让我先length一下找到string的长度再通过下标读取,我觉得这种方法很笨,像我这题中string是不断读入字符的,因此长度在变,那种方法就不适用了。

3.最开始include的string库中包含很多好用的string函数,例如本题用到的erase,可以擦除指定位置的字符。

好了,我们下期见!

猜你喜欢

转载自blog.csdn.net/miss_yuki/article/details/80051931