LeetCode 678. 有效的括號字串(C、C++、python)
阿新 • • 發佈:2018-11-21
給定一個只包含三種字元的字串:(
,)
和 *
,寫一個函式來檢驗這個字串是否為有效字串。有效字串具有如下規則:
- 任何左括號
(
必須有相應的右括號)
。 - 任何右括號
)
必須有相應的左括號(
。 - 左括號
(
必須在對應的右括號之前)
。 *
可以被視為單個右括號)
,或單個左括號(
,或一個空字串。- 一個空字串也被視為有效字串。
示例 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)