暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

有效的括号

三木小小推 2019-03-13
328

微信公众号:三木小小推
系列:刷题之Python
如果你觉得Md2All对你有帮助,欢迎点好看[1]

题目描述

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:
输入: "()"
输出: true

示例 2:
输入: "()[]{}"
输出: true

示例 3:
输入: "(]"
输出: false

示例 4:
输入: "([)]"
输出: false

示例 5:
输入: "{[]}"
输出: true

解决方案

1 利用 in

By Python

class Solution:
    def isValid(self, s):
        while '{}' in s or '()' in s or '[]' in s:
            s = s.replace('{}''')
            s = s.replace('[]''')
            s = s.replace('()''')
        return s == ''

2 出入栈

PS: C++ 大神指针玩儿的真是666,学习了

By C++

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;
}

3 官方解答撸一遍(也是出入栈)

(1) python 版

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """

        # 定义栈
        stack = []
        # hash map
        mapping = {")""(""}""{""]""["}

        for char in s: 

            if char in mapping: # in方法在dict中指向key

                top_element = stack.pop() if stack else '#'
                # 出栈

                if mapping[char] != top_element:
                    return False
            else:
                stack.append(char)  # 入栈

        return not stack

(2) java版

class Solution {

  // 定义private 哈希表 HashMap mappings方法 
  private HashMap<Character, Character> mappings;

  // 定义public类 ,用来初始化HashMap
  public Solution() {
    this.mappings = new HashMap<Character, Character>();
    this.mappings.put(')''(');
    this.mappings.put('}''{');
    this.mappings.put(']''[');
  }

  public boolean isValid(String s) {

    // 建立 Stack 栈
    Stack<Character> stack = new Stack<Character>();

    for (int i = 0; i < s.length(); i++) {
      char c = s.charAt(i);

      if (this.mappings.containsKey(c)) {

        // 经典C++冒号语句~~ 出栈
        char topElement = stack.empty() ? '#' : stack.pop();

        if (topElement != this.mappings.get(c)) {
          return false;
        }
      } else {
        // 入栈
        stack.push(c);
      }
    }

    return stack.isEmpty();
  }
}

欢迎订阅

下面是三木小小推的二维码,欢迎订阅呦~~


你点的每个好看,我都认真当成了喜欢
文章转载自三木小小推,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论