大家好,今天继续刷题日记,这道题是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,可以擦除指定位置的字符。
好了,我们下期见!