1. 程式人生 > 其它 >【19】有效的括號 | 實現 strStr()(LeetCode 20 | 28)

【19】有效的括號 | 實現 strStr()(LeetCode 20 | 28)

技術標籤: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演算法,瞭解了一下思想,還沒用程式碼實現。