LeetCode 20 有效的括號

題目描述:

給定一個只包括 '('')''{''}''['']' 的字符串,判斷字符串是否有效。

有效字符串需滿足:

  1. 左括號必須用相同類型的右括號閉合。
  2. 左括號必須以正確的順序閉合。

注意空字符串可被認爲是有效字符串。

示例 1:

輸入: "()"
輸出: true

示例 2:

輸入: "()[]{}"
輸出: true

示例 3:

輸入: "(]"
輸出: false

示例 4:

輸入: "([)]"
輸出: false

示例 5:

輸入: "{[]}"
輸出: true

相關話題:棧, 字符串

相似題目:

解題思路:

設置一個匹配計數器,如果是左括號,將其進棧,計數器遞增,如果是與之匹配的右括號,計數器遞減。最後根據計數器的值是否爲0來判斷,在布爾值中,非0即爲真,返回true,0即爲假,返回false.

C語言:

bool isValid(char * s){
int length=0;//定義字符串長度
while(*(s+length))length++;//獲取字符串長度
char* ptr=(char*)malloc(length/2);//分配內存空間
memset(ptr,0,length/2);//初始化內存空間
int i,a=0;
for(i=0;i<length;i++)
{
    if((*(s+i)=='(')||(*(s+i)=='{')||(*(s+i)=='['))
    {
        a++;
        *(ptr+a)=*(s+i);
    }
    //'('與')'的ASCII值差1,'['與']','{'與'}'的ASCII值差2
    else if((*(s+i)==(*(ptr+a)+1))||(*(s+i)==(*(ptr+a)+2)))
    {
        a--;
    }
    else return 0;
}
if(a)
    return 0;
return 1;
}

C++ 

class Solution {
public:
    bool isValid(string s) {
        int length = s.size();
        for(int i = 0 ; i < length; i++){
            for(int j = 0; j < length; j++){
                if(s[j] == '(' && s[j+1] == ')' 
                   || s[j] == '[' && s[j+1] == ']' 
                   ||s[j] == '{' && s[j+1] == '}'){
                    s.erase(j, 2);
                }
            }
        }
        return s=="";
    }
};

Java 

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        char[] chars = s.toCharArray();
        for (char aChar : chars) {
            if (stack.size() == 0) {
                stack.push(aChar);
            } else if (isSym(stack.peek(), aChar)) {
                stack.pop();
            } else {
                stack.push(aChar);
            }
        }
        return stack.size() == 0;
    }
    
    private boolean isSym(char c1, char c2) {
        return (c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}');
    }
}

總結:對於括號匹配類問題,最先想到的數據結構就是堆棧,而且,('與')'的ASCII值差1;'['與']','{'與'}'的ASCII值差2,這是一個非常有用的性質,應該記下來。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章