[Leetcode]678.Valid Parenthesis String
链接:LeetCode678
给定一个只包含三种字符的字符串:( ,) 和,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
任何左括号 ( 必须有相应的右括号 )。
任何右括号 ) 必须有相应的左括号 ( 。
左括号 ( 必须在对应的右括号之前 )。
可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
一个空字符串也被视为有效字符串。
示例 1:
输入: "()"
输出: True
示例 2:
输入: "(*)"
输出: True
很明显,我们在遍历字符串的过程中,左,右括号的数量对比对是否是有效字符串是很有帮助的。我们考虑以下问题,假如没有号的机制,判定是否有效是十分容易的,我们如何得到个号替换后的字符串呢?也就是说,如何判断当前应该为"("还是")"?
这里,我们在遍历字符串过程中,设定两个变量lo和hi,分别代表左括号比右括号多的最少个数,和最大个数,那么就有以下结论:
- 当当前字符为左括号(,那么lo和hi都加1;
- 当当前字符为,那么
- 当lo>0,也就是左括号数量肯定比右括号多了,该号通过替换为右括号,显然左括号比右括号多的最少个数需要减1,同时,最大个数加1;
- 否则,最大个数加1即可。
- 当当前字符为右括号),那么
- 当lo>0,则lo需要减1,同时,最大个数也减1
- 否则,最大个数减1 即可(例子:)
- 当出现hi<0:则说明即使将所有*号替换为左括号,也会出现右括号大于左括号的现象,也就是无效的字符串。
最后,判断lo==0即可。
对于这种题,记住代码不如记住思考的方法。首先,我们需要判断每一个号是替换左/右括号,还是替换为空,这又与左边的左,右括号有关。那么,我们设置了lo和hi两个变量,实际上也就是这不断探测号所处的状态和如何进行状态更换,这里不妨多设几个例子来细细琢磨。
代码如下:
python:
class Solution:
def checkValidString(self, s: str) -> bool:
lo = hi = 0
for ch in s:
if ch=='(':
lo += 1
hi += 1
elif ch == ')':
if lo>0:lo -= 1
hi -= 1
else:
if lo>0:lo -= 1
hi += 1
if hi<0:return False
return lo==0
C++:
class Solution {
public:
bool checkValidString(string s) {
int lo=0,hi=0;
for (char ch:s){
if(ch=='(') {
lo ++;
hi ++;
}
else if(ch==')') {
if(lo>0) lo--;
hi --;
}
else{
if(lo>0) lo--;
hi ++;
}
if(hi<0) return false;
}
return lo==0;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)