問題描述:
給定一個只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判斷字符串是否有效。
有效字符串需滿足:
- 左括號必須用相同類型的右括號閉合。
- 左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: "()"
輸出: true
示例 2:
輸入: "()[]{}"
輸出: true
示例 3:
輸入: "(]"
輸出: false
示例 4:
輸入: "([)]"
輸出: false
示例 5:
輸入: "{[]}"
輸出: true
解法一:
用棧。
思路:此題只需要採用位運算,每次將原來的數字向左移動1位,就需要把該末尾加到我們的數字中去即可,此題需要注意的是一點要循環32次,不僅是有32位,最重要的不能判斷到原來的數字爲0就結束循環,這樣就有可能的導致沒有補足0所以要循環32次。
同時對於左移而言,末尾全部補上的是0,而對於右移而言左邊補的是原本最高位的數字,比如一個32位的數字最高位(也就是符號位)爲1就全部補上1,如果爲0 就全部補上0.這個知識點也是面試常考的。
代碼如下:
class Solution {
public:
bool isValid(string s) {
stack<char> st;
int n = s.length();
for(int i =0; i < n ; i++){
if(s[i]=='(' || s[i]=='[' || s[i]=='{'){
st.push(s[i]);
continue;
}
char top = -1;
if(!st.empty()) top = st.top();
if(s[i]==')'){
if(top != '(') return false;
st.pop();
}
if(s[i]==']'){
if(top != '[') return false;
st.pop();
}
if(s[i]=='}'){
if(top != '{') return false;
st.pop();
}
}
if(st.empty()) return true;
else return false;
}
};