【题目描述】

给定一个只包含三种类型字符的字符串:'(',')'和 '*', 编写一个函数来检查该字符串是否有效。 我们通过以下规则定义字符串的有效性:

1.任何左括号 '('必须有一个相应的右括号')'

2.任何右括号 ')' 必须有一个相应的左括号'('

3.左括号'(' 必须在相应的右括号 ')' 之前。

4.*可以被视为单个右括号')'或单个左括号'('或空字符串。

5.空字符串也有效。

在线评测地址:LintCode 领扣

【样例】

样例 1:输入:  "()"输出:  true样例 2:输入: "(*)"输出:  true解释:'*' 看作是空串.样例 3:输入: "(*))"输出: true解释:'*' 当作'('

【题解】

一道简单的思维题,考虑到星号在其中的用处就能解决.

  1. 首先进行最基础的考虑,(在不考虑星号的情况下)我们必定会选择位置最接近的左右括号配对,这样避免了人为造成的右括号前面没有左括号匹配的惨剧。因此我们在写程序进行处理的时候,对于每个右括号判断前面是否有1个左括号能被他拥有,如果左括号数量不足,这个字符串必定是false,或者当整个串被匹配完之后发现有多余的左括号,这个字符串同样是false。
  2. 接下来考虑有星号的情况:”)”必须由位置在它之前的”(”或”*”匹配,如果”(”或者”*”数量不足导致的false是无法避免的,而如果”(“ 比”)”多,将”(”与”*”优先匹配可以减小false的可能性。举个例子如样例3,从左往右遍历的时候,优先匹配”(”和”*”,遇见第一个”)”,发现没有单独的”(”,从”(*”的组合中拆出一个”(“与之匹配,而原先匹配中的*因为可以等同于不存在便不予理会,接着遇到第二个”)”,拿走刚才剩余的”*”。综上我们可以观察到,”(”容易受制于”)”而将其与”*”匹配后就很灵活,不仅避免了数量太多带来的麻烦,也能在和*匹配后再次提供自身给”)”进行匹配。而如果这样匹配结束还有多余的”(”则必定false
  3. 我们设l(left)为必须被右括号匹配的左括号数量,cp(couple)为前面左括号和星号数量。遍历字符串,遇到左括号和星号的时候,cp++; 遇到右括号的时候cp--; 遇到星号,默认先于前面的左括号(l>0)匹配,此时(l—),遇到右括号,默认先与前面必须与右括号匹配的左括号匹配,此时(l—;cp—;)或者在支援兵中考虑(cp—) 注意cp是前方左右的左括号和星号数量,一旦cp<0即false. 匹配完发现(l>0)即多出了左括号,也为false。剩下的情况就是true了
public class Solution {/*** @param s: the given string* @return: whether this string is valid*/public boolean checkValidString(String s) {// Write your code hereint len=s.length();int l=0, cp=0;for (int i=0; i<len; i++) {if (s.charAt(i)=='(') {l++;cp++;} else if (s.charAt(i)=='*') {if (l>0) {l--;}cp++;} else {if (l>0) l--;cp--;if (cp<0) return false;}}if (l==0)return true;elsereturn false;}
}

更多语言代码参见:九章算法

匹配左括号或者右括号js_九章算法 | 蚂蚁金服面试题:有效的括号字符串相关推荐

  1. 捡漏!蚂蚁金服面试题泄露,看完这十道面试必问真题,冲刺金九银十,稳拿大厂Offer!!

    前言 最近编程讨论群有位小伙伴去蚂蚁金服面试了,以下是面试的真题,跟大家一起来讨论怎么回答. 1. 用到分布式事务嘛?为什么用这种方案,有其他方案嘛? 什么是分布式事务 谈到事务,我们就会想到数据库事 ...

  2. 春招面试经验系列(九)蚂蚁金服

    分享一个我的公众号,最近突然想玩公众号,之前做过一段时间前端开发,考虑到现在应用程序越来越多,未来社会一定是一个充满"只有你想不到,没有你做不到"的App的世界!而微信小程序又给我 ...

  3. 分治习题--九章算法培训课第三章笔记

    1.Maximum Depth of Binary Tree 这是道简单的分治习题了 分: 左子树最大深度 右子树最大深度 治: 最大深度等于max(左子树,右子树)+1 public class S ...

  4. 编号是i的结点所在的层次号是_九章算法 | 微软面试题:二叉树的锯齿形层次遍历...

    给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) 在线评测地址:LintCode 领扣 样例 1: 输入:{1,2,3} 输出:[[1],[3,2]] ...

  5. 九章算法高频算法题 题解

    专栏 | 九章算法 网址 | http://www.jiuzhang.com Google 面试题: Google 面试题 | 目标和 Google 面试题 | 建邮局 Google 面试题 | 0与 ...

  6. 九章算法【总结】Java 搞定链表-面试常考题目精选

    面试大总结之链表 CS3K.com 一.OverView: 链表是面试中常考的,本文参考了其它一些文章,加上小编的自己总结,基本每个算法都测试并优化过. 算法大全(1)单链表 中还有一些链表题目,将来 ...

  7. 动态规划法求最大字段和时间复杂度_九章算法 | 动态规划:最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度. 在线评测地址:LintCode 领扣 说明 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低 ...

  8. 最长回文子串动态规划_九章算法 | 微软面试题:最长回文子串

    给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 在线评测地址:LintCode 领扣 样例 1: 输入:"abcdzdcab&quo ...

  9. 蚂蚁金服CTO程立:从Fintech到Techfin,未来十年有九大重要挑

    蚂蚁金服CTO程立:从Fintech到Techfin,未来十年有九大重要挑战 本文作者:伊莉 2017-03-09 10:49 导语:推动Techfin大跨步前进的关键技术:交易,服务,连接,决策,分 ...

最新文章

  1. android逆向分析概述_Android存储概述
  2. PHP CURL 哈哈哈哈哈记录一下
  3. 自己建服务器 语音盒子_如何自己搭建一个服务器?
  4. 给windows设置隐藏文件夹的方法
  5. SQL脚本:监控当前重做日志文件使用情况
  6. 启明云端分享| ESP8266\ESP32-C3\ESP32-C2三款芯片从核心系统、WIFI射频和基带、外围设备等都有哪些区别
  7. idea本地跑如何看gc日志_牛逼了!用 IDEA 扒出了开源组件导致FGC的原因
  8. 机械硬盘 mysql调优_【MYSQL】使用RAID增加传统机器硬盘的性能
  9. java kafka 分区_Java kafka如何实现自定义分区类和拦截器
  10. matlab中ode45函数的用法_带你理解Excel中COUNTIF函数的简单用法
  11. Spring强制使用CGLIB代理事务
  12. C# 色系表配色 颜色表 美工必备
  13. 算法小结——KM算法
  14. 宋代词人前十名都有谁?第一名更是震铄古今最全能的大文豪
  15. OceanBase 之 OBCA考试总结
  16. 存储器类型与S3C2440启动地址
  17. 海尔集团CEO张瑞敏演讲《人不成熟的几大特征》
  18. java设备未就绪_java.io.IOException: 设备未就绪
  19. RationalDMIS 2020旋转坐标系
  20. php的mysqli步骤,php安装扩展mysqli的实现步骤及报错解决办法

热门文章

  1. linux 安卓svn,linux安装svn
  2. android studio 便携式wlan热点 网络名称_速存 | WLAN信号增强器
  3. php漏洞书籍,PHP漏洞全解(一)-PHP网站的安全性问题
  4. vs调用matlab功能,vs调用matlab
  5. java通道 硬件通道 如何联系_Java NIO5:通道和文件通道
  6. lda 协方差矩阵_数据降维算法总结(LDAamp;PCA)
  7. 'tensorflow' has no attribute 'sub'
  8. linux mysql 建索引_MySQL在创建索引之前一定要想到的事情
  9. Mysql基础知识--视图
  10. Android内存泄漏定位、分析、解决全方案