給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
示例 1:
輸入: “()”
輸出: true
示例 2:
輸入: “()[]{}”
輸出: true
示例 3:
輸入: “(]”
輸出: false
示例 4:
輸入: “([)]”
輸出: false
示例 5:
輸入: “{[]}”
輸出: true
解題思路:遍歷題給字符串,新建一個棧或者vector,如果是左括號的話,一律壓入,如果是右括號,則看前一個被壓入的是不是與之匹配的左括號,這需要分類討論,如果不是,則返回false,否則就將左括號刪除,繼續遍歷下一個元素、以此類推。直到新建的棧或者vector中沒有元素,返回true,否則返回false。
代碼1如下:(使用vector)
class Solution {
public:
bool isValid(string s) {
int len = s.length();
vector<char> stack;
for (int i = 0; i < len; i++) {
// 左括號壓棧
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
stack.push_back(s[i]);
else {
// 右括號出棧
if (stack.empty())
return false;
char top = stack[stack.size() - 1];
if (s[i] == ')' && top != '(')
return false;
if (s[i] == ']' && top != '[')
return false;
if (s[i] == '}' && top != '{')
return false;
stack.pop_back();
}
}
// 棧中無多餘左括號
if (stack.size() > 0)
return false;
return true;
}
};
代碼2如下:(使用棧)
class Solution {
public:
bool isValid(string s) {
int len = s.length();
stack<char> temp;
for (int i = 0; i < len; i++) {
// 左括號壓棧
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
temp.push(s[i]);
else {
// 右括號出棧
if (temp.empty())
return false;
char top = temp.top();
if (s[i] == ')' && top != '(')
return false;
if (s[i] == ']' && top != '[')
return false;
if (s[i] == '}' && top != '{')
return false;
temp.pop();
}
}
// 棧中無多餘左括號
if (!temp.empty())
return false;
return true;
}
};
解題思路2:在思路一的基礎上,可以不需要分類討論,可以在最開始的時候搞一個map,這樣每次都是右括號的情況就可以從map中查了,而不用其他多餘判斷。其他的思路大致一樣。
代碼如下:
class Solution {
public:
bool isValid(string s) {
map<char, char> kuohao;
kuohao['('] = ')';
kuohao['{'] = '}';
kuohao['['] = ']';
stack<char> temp;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(' || s[i] == '{' || s[i] == '[') {
temp.push(s[i]);
}
else if (temp.empty() || kuohao[temp.top()] != s[i]) {
return false;
}
else {
temp.pop();
}
}
return temp.empty();
}
};