给定一个只包含三种字符的字符串:(
,)
和 *
,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
- 任何左括号
(
必须有相应的右括号)
。 - 任何右括号
)
必须有相应的左括号(
。 - 左括号
(
必须在对应的右括号之前)
。 *
可以被视为单个右括号)
,或单个左括号(
,或一个空字符串。- 一个空字符串也被视为有效字符串。
示例 1:
输入: "()" 输出: True
示例 2:
输入: "(*)" 输出: True
示例 3:
输入: "(*))" 输出: True
注意:
字符串大小将在 [1,100] 范围内。
C
bool checkValidString(char* s)
{
int n=strlen(s);
int* tmp=(int*)malloc(sizeof(int)*n);
int* xin=(int*)malloc(sizeof(int)*n);
int k=0;
int r=0;
for(int i=0;i<n;i++)
{
if('('==s[i])
{
tmp[k++]=i;
}
else if('*'==s[i])
{
xin[r++]=i;
}
else
{
if(0==k)
{
if(0==r)
{
return false;
}
else
{
r--;
}
}
else
{
k--;
}
}
}
while(k>0 && r>0)
{
if(tmp[k-1]>xin[r-1])
{
return false;
}
else
{
k--;
r--;
}
}
return 0==k;
}
C++
class Solution {
public:
bool checkValidString(string s)
{
int n=s.length();
stack<int> tmp; //存放左括号的位置
stack<int> xin; //存放*号的位置
for(int i=0;i<n;i++)
{
if('('==s[i])
{
tmp.push(i);
}
else if('*'==s[i])
{
xin.push(i);
}
else
{
if(tmp.empty())
{
if(xin.empty())
{
return false;
}
else
{
xin.pop();
}
}
else
{
tmp.pop();
}
}
}
while(!tmp.empty() && !xin.empty())
{
if(tmp.top()>xin.top())
{
return false;
}
else
{
tmp.pop();
xin.pop();
}
}
return true==tmp.empty();
}
};
python
class Solution:
def checkValidString(self, s):
"""
:type s: str
:rtype: bool
"""
n=len(s)
tmp=[]
xin=[]
for i in range(n):
if '('==s[i]:
tmp.append(i)
elif '*'==s[i]:
xin.append(i)
else:
if(0==len(tmp)):
if(0==len(xin)):
return False
else:
del xin[-1]
else:
del tmp[-1]
while len(tmp)>0 and len(xin)>0:
if tmp[-1]>xin[-1]:
return False
else:
del tmp[-1]
del xin[-1]
return 0==len(tmp)