C++ 有效的括号
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
示例 1:
輸入:s = "()" 輸出:true示例 2:
輸入:s = "()[]{}" 輸出:true示例 3:
輸入:s = "(]" 輸出:false示例 4:
輸入:s = "([)]" 輸出:false示例 5:
輸入:s = "{[]}" 輸出:true方法1.棧
判斷括號的有效性可以使用「棧」這一數(shù)據(jù)結(jié)構(gòu)來解決。
我們遍歷給定的字符串 s。當(dāng)我們遇到一個左括號時,我們會期望在后續(xù)的遍歷中,有一個相同類型的右括號將其閉合。由于后遇到的左括號要先閉合,因此我們可以將這個左括號放入棧頂。
當(dāng)我們遇到一個右括號時,我們需要將一個相同類型的左括號閉合。此時,我們可以取出棧頂?shù)淖罄ㄌ柌⑴袛嗨鼈兪欠袷窍嗤愋偷睦ㄌ枴H绻皇窍嗤念愋?#xff0c;或者棧中并沒有左括號,那么字符串 s 無效,返回 false。
bool isValid(string s) {if (s.size() % 2 == 1)return false;if (s.size() == 0)return true;stack<char> brackets;for (char c : s) {if (c == '(' || c == '{' || c == '[')brackets.push(c);else if (brackets.empty()){printf("false");return false;} else if (c == ')') {char cnow = brackets.top();if (cnow == '(')brackets.pop();else{printf("false");return false;} }else if (c == '}') {char cnow = brackets.top();if (cnow == '{')brackets.pop();else{printf("false");return false;}}else {char cnow = brackets.top();if (cnow == '[')brackets.pop();else{printf("false");return false;}}}printf("true");return brackets.empty(); }方法2.replace函數(shù)
這是我在一篇博客中看到的方法,通過replace函數(shù)替代其中成對的括號,最后判斷字符串是否還有剩余。
原代碼是Java的代碼,如下:
public boolean isValid(String s) {//假如長度是1或者不為偶數(shù)if(s.length()<2||s.length()%2!=0){if(s.isEmpty()){return true;}else{return false;}}int count = 0;int length = s.length();//循環(huán)替換,最大次數(shù)為s.length()/2while(count<length/2){s = s.replace("{}","").replace("[]","").replace("()","");count++;}//假如循環(huán)替換完,還有值,那么肯定就不是對稱結(jié)構(gòu)if(s.length()>0){return false;}else{return true;}}隨后我查看了C++中也有replace函數(shù)的聲明,頭文件為string。根據(jù)另一篇博客中對于replace函數(shù)的使用介紹修改了上面的代碼,修改后的代碼如下:
bool isValid2(string s) {//假如長度是1或者不為偶數(shù)if (s.length() < 2 || s.length() % 2 != 0) {if (s.empty()) {return true;}else {return false;}}int count = 0;int length = s.length();//循環(huán)替換,最大次數(shù)為s.length()/2while (count < length / 2) {//s = s.replace("{}",2, " ").replace("[]", "").replace("()", "");//s = s.replace("{}", 2, " ");s = s.replace(s.find("{"), 1, "t");//s = s.replace(s.find("[]"), 2, " ");//s = s.replace(s.find("()"), 2, " ");count++;}//假如循環(huán)替換完,還有值,那么肯定就不是對稱結(jié)構(gòu)if (s.length() > 0) {printf("false");return false;}else {printf("true");return true;} }但是這里遇到了一個問題:
s = s.replace(s.find("{"), 1, "t");這行代碼中我在s.find中查找括號時程序調(diào)試時會報(bào)錯:
但是例如我給一個字母進(jìn)行查找替換則不會出現(xiàn)問題。例如我給一個字符串然后讓其查找a并用t替換:
s = s.replace(s.find(“a”), 1, “t”);
所以這里我不確定是C++中的replace函數(shù)不支持查找括號還是我這里的寫法有問題。但是看到挺多地方提到Java中可以使用該函數(shù)解這道題。
整體代碼如下:
#include <iostream> #include <cstdlib> #include <ctime> #include <stack> #include <string> using namespace std;bool isValid(string s) {printf("輸入為:%s\n", s.c_str());if (s.size() % 2 == 1)return false;if (s.size() == 0)return true;stack<char> brackets;//for (char c : s)這是C++11中新增的一種循環(huán)寫法,對數(shù)組(或容器類,如vector和array)的每個元素執(zhí)行相同的操作,此外string類也支持這種對字符的遍歷循環(huán)操作。//for(double x:prices)。x最初表示數(shù)組prices的第一個元素,顯示第一個元素后,不斷執(zhí)行循環(huán),而x依次表示數(shù)組的其他元素。for (char c : s) {if (c == '(' || c == '{' || c == '[')brackets.push(c);else if (brackets.empty()){printf("結(jié)果為:false");return false;} else if (c == ')') {char cnow = brackets.top();if (cnow == '(')brackets.pop();else{printf("結(jié)果為:false");return false;} }else if (c == '}') {char cnow = brackets.top();if (cnow == '{')brackets.pop();else{printf("結(jié)果為:false");return false;}}else {char cnow = brackets.top();if (cnow == '[')brackets.pop();else{printf("結(jié)果為:false");return false;}}}printf("結(jié)果為:true");return brackets.empty(); }//bool isValid2(string s) { // //假如長度是1或者不為偶數(shù) // if (s.length() < 2 || s.length() % 2 != 0) { // if (s.empty()) { // return true; // } // else { // return false; // } // } // int count = 0; // int length = s.length(); // //循環(huán)替換,最大次數(shù)為s.length()/2 // while (count < length / 2) { // //s = s.replace("{}",2, " ").replace("[]", "").replace("()", ""); // //s = s.replace("{}", 2, " "); // s = s.replace(s.find("{"), 1, "t"); // //s = s.replace(s.find("[]"), 2, " "); // //s = s.replace(s.find("()"), 2, " "); // count++; // } // //假如循環(huán)替換完,還有值,那么肯定就不是對稱結(jié)構(gòu) // if (s.length() > 0) // { // printf("false"); // return false; // } // else { // printf("true"); // return true; // } //} bool replace(string str) {str = str.replace(str.find("a"), 2, "#");printf("\n");cout <<"輸入:"<< str << endl;return 0; } int main() {string res = "[{((}]";//string res = "aacabd";string str = "he is@ a@ good boy";int n = 16;//數(shù)組元素的個數(shù),即生成隨機(jī)數(shù)的個數(shù)int target = 30;//int a[16];isValid(res);replace(str);//Random(a, n, 1, 19);//生成隨機(jī)數(shù)的通常范圍為0~32767,這里通過取模控制取值為0~100 //search(a, n, target);//printf("%s %d",a, n);return 0; }效果如下:
參考:
https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode-solution/
https://blog.csdn.net/qq_38455201/article/details/82887217
https://blog.csdn.net/wuxiecsdn/article/details/114589773
https://blog.csdn.net/qian2213762498/article/details/79530974
https://leetcode-cn.com/problems/valid-parentheses/
總結(jié)
- 上一篇: #define宏加括号和不加括号的区别
- 下一篇: C/C++语言入门——鸡兔同笼问题