【19】有效的括號 | 實現 strStr()(LeetCode 20 | 28)
阿新 • • 發佈:2021-01-23
技術標籤:LeetCode刷題筆記字串演算法leetcodec++
有效的括號
問題描述
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字串,判斷字串是否有效。
有效字串需滿足:
左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。
解題思路
這個題在大二學習資料結構(棧)的時候講過,所以看到也直接有了思路,利用棧的後進先出的特點來解題,主要思想是:如果是左括號,則進棧;如果是右括號,則檢測棧頂是否是其相應的左括號,若是則彈棧,若不是則說明括號不合法。
class Solution {
public:
bool isValid (string s) {
int n=s.size();
bool res=true;
if(n!=0){
stack <char> stk;
for(int i=0;i<n;i++){
switch (s[i]){
case '(' :
stk.push(s[i]);
break;
case ')' :
if((!stk.empty())&&stk.top()=='(')
stk.pop();
else
res=false;
break;
case '{' :
stk.push(s[i]);
break ;
case '}' :
if((!stk.empty())&&stk.top()=='{')
stk.pop();
else
res=false;
break;
case '[' :
stk.push(s[i]);
break;
case ']' :
if((!stk.empty())&&stk.top()=='[')
stk.pop();
else
res=false;
break;
}
if(res==false)
break;
}
if(!stk.empty())
res=false;
}
return res;
}
};
時間複雜度:O(n)
空間複雜度:O(n)
評論區看到的一位碼友的簡短程式碼:
class Solution {
public:
bool isValid(string s) {
int n=s.size();
if(n==0) return true;
stack <char> stk;
for(int i=0;i<n;i++){
if(s[i]=='(')
stk.push(')');
else if(s[i]=='{')
stk.push('}');
else if(s[i]=='[')
stk.push(']');
else if(stk.empty()||s[i]!=stk.top())
return false;
else
stk.pop();
}
if(!stk.empty())
return false;
return true;
}
};
思想是:如果是左括號,就將所期待的右括號入棧;如果是右括號,就檢測棧是否為空且棧頂元素是否與該右括號匹配,若為空或不匹配則返回false,若匹配上了則彈棧;逐個檢查完後檢測棧是否為空,若括號串合法的話則應該所有期待的右括號都得到了匹配,棧為空,所以若棧不為空則返回false,否則返回true。
實現 strStr()
問題描述
給定一個 haystack 字串和一個 needle 字串,在 haystack 字串中找出 needle 字串出現的第一個位置 (從0開始)。如果不存在,則返回 -1。
解題思路
這個題需要實現的類似於C++中String的find函式。
測試了一下直接呼叫這個函式:
class Solution {
public:
int strStr(string haystack, string needle) {
int position=haystack.find(needle);
return position;
}
};
自己寫的話最容易想到的就是雙重迴圈來判斷:
class Solution {
public:
int strStr(string haystack, string needle) {
int position = -1;
int n=haystack.size();
int m=needle.size();
if(m>n) return position;
if(m==0) return 0;
for(int i=0;i<n;i++){
if(haystack[i]==needle[0]){//如果haystack的某個字元等於要查詢的字串的首字元
position=i;//則記錄下現在的位置,並依次比較後面的字元是否匹配
for(int j=1;j<m;j++){
int temp=i+j;
if(temp>n||haystack[temp]!=needle[j]){//若出現不匹配或不能匹配完的情況則說明不是目標位置,position置為-1
position=-1;
break;
}
}
}
if(position!=-1) break;//檢測到position不為-1了則說明已經找到了,可以結束迴圈
}
return position;
}
};
最壞情況下時間複雜度是O(n*m)
這也太慢了…
通過題解了解到了KMP演算法,瞭解了一下思想,還沒用程式碼實現。