- 浏览: 184671 次
- 性别:
- 来自: 济南
文章分类
最新评论
这篇文章总结leetcode中有关括号的问题,最简单的是判断输入的括号是否有效,例如“))”就不属于有效的括号,括号的题目无非是添加,删除,找到最长有效括号等。最长有效括号是一道DP问题,我们在DP总结中结合最长回文子串一起列出。下面列举几个基本的题目。
1,Valid Parentheses
给定一个字符串序列,它包含'(', ')', '{', '}', '[' , ']',判断字符串是否是有效括号组成的。
例如:"()" 和 "()[]{}" 是有效字符串;而 "(]" 和 "([)]" 就不是合法字符串。
我们用堆栈解决这道题,从第一个字符开始遍历,遇到‘(’ , '{' 或‘{’时,我们就把它压入到堆栈中,如果遇到‘)' , ']' 和‘}’时我们将字符出栈,并且与当前字符比较,如果匹配就继续查找,如果不匹配返回false。在遍历完之后,我们要检查堆栈是否为空,如果不为空,也返回false。
例如“((())”就会导致遍历结束后,栈中还有一个字符‘(’,而它是无效的字符串。代码如下:
2,Generate Parentheses
给定n对括号,列出所有可能的有效组合。
例如:n = 3
输出 :"((()))", "(()())", "(())()", "()(())", "()()()"
看到组合问题我们就想到用回溯法,回溯的条件是字符串的长度为2n时,我们就把它记录下来,然后回溯找其它的答案。当查找的时候,我们设定两个变量left和right,分别代表左括号的数量和右括号的数量,当左括号不为零时,我们可以继续添加左括号;而对于右括号,我们要保证再往下查找的时,右括号的数量大于左括号的数量(right > left), 否则就会生成错误结果。
代码如下:
3,Different Ways to Add Parentheses
给定一个字符串,字符串由数字和操作符组成,通过添加不同的括号列出所有可能的计算结果。
例如:输入:"2*3-4*5"
输出:[-34, -14, -10, -10, 10]
结果是由以下的方式计算出来的:
(2*(3-(4*5))) = -34
((2*3)-(4*5)) = -14
((2*(3-4))*5) = -10
(2*((3-4)*5)) = -10
(((2*3)-4)*5) = 10
这道题我们用递归来解决,遍历字符串,当遇到操作符号时,我们就分别递归当前操作符的左边部分和右边部分,最终得到结果。代码如下:
1,Valid Parentheses
给定一个字符串序列,它包含'(', ')', '{', '}', '[' , ']',判断字符串是否是有效括号组成的。
例如:"()" 和 "()[]{}" 是有效字符串;而 "(]" 和 "([)]" 就不是合法字符串。
我们用堆栈解决这道题,从第一个字符开始遍历,遇到‘(’ , '{' 或‘{’时,我们就把它压入到堆栈中,如果遇到‘)' , ']' 和‘}’时我们将字符出栈,并且与当前字符比较,如果匹配就继续查找,如果不匹配返回false。在遍历完之后,我们要检查堆栈是否为空,如果不为空,也返回false。
例如“((())”就会导致遍历结束后,栈中还有一个字符‘(’,而它是无效的字符串。代码如下:
public class Solution { public boolean isValid(String s) { Stack<Character> stack = new Stack<Character>(); for(int i = 0; i < s.length(); i++) { char c = s.charAt(i); if(c == '[' || c == '(' || c == '{') { stack.push(c); } else { if(stack.isEmpty()) return false; char cs = stack.pop(); if((c == ')' && cs == '(') || (c == ']' && cs == '[') || (c == '}' && cs == '{')) continue; else return false; } } if(!stack.isEmpty()) return false; return true; } }
2,Generate Parentheses
给定n对括号,列出所有可能的有效组合。
例如:n = 3
输出 :"((()))", "(()())", "(())()", "()(())", "()()()"
看到组合问题我们就想到用回溯法,回溯的条件是字符串的长度为2n时,我们就把它记录下来,然后回溯找其它的答案。当查找的时候,我们设定两个变量left和right,分别代表左括号的数量和右括号的数量,当左括号不为零时,我们可以继续添加左括号;而对于右括号,我们要保证再往下查找的时,右括号的数量大于左括号的数量(right > left), 否则就会生成错误结果。
代码如下:
public class Solution { public List<String> generateParenthesis(int n) { LinkedList<String> list = new LinkedList<String>(); int left = n; int right = n; String result = ""; generateParent(n, left, right, result, list); return list; } public void generateParent(int n, int left, int right, String result, LinkedList<String> list) { if(result.length() == 2 * n) { list.add(result); } if(left > 0) generateParent(n, left - 1, right, result + "(", list); if(right > left) generateParent(n, left, right - 1, result + ")", list); } }
3,Different Ways to Add Parentheses
给定一个字符串,字符串由数字和操作符组成,通过添加不同的括号列出所有可能的计算结果。
例如:输入:"2*3-4*5"
输出:[-34, -14, -10, -10, 10]
结果是由以下的方式计算出来的:
(2*(3-(4*5))) = -34
((2*3)-(4*5)) = -14
((2*(3-4))*5) = -10
(2*((3-4)*5)) = -10
(((2*3)-4)*5) = 10
这道题我们用递归来解决,遍历字符串,当遇到操作符号时,我们就分别递归当前操作符的左边部分和右边部分,最终得到结果。代码如下:
public class Solution { public List<Integer> diffWaysToCompute(String input) { List<Integer> list = new LinkedList<Integer>(); if(!input.contains("+") && !input.contains("-") && !input.contains("*")) { list.add(Integer.valueOf(input)); return list; } for(int i = 0; i < input.length(); i++) { char c = input.charAt(i); if(c == '+' || c == '*' || c == '-') { List<Integer> leftlist = diffWaysToCompute(input.substring(0, i)); List<Integer> rightlist = diffWaysToCompute(input.substring(i + 1, input.length())); for(int leftvalue : leftlist) for(int rightvalue : rightlist) { switch (c) { case '+': list.add(leftvalue + rightvalue); break; case '-': list.add(leftvalue - rightvalue); break; case '*': list.add(leftvalue * rightvalue); break; } } } } return list; } }
发表评论
-
498. Diagonal Traverse
2019-11-15 13:52 269Given a matrix of M x N eleme ... -
496 Next Greater Element I
2019-11-14 13:50 271You are given two arrays (witho ... -
Word Break II
2016-03-09 03:15 388Given a string s and a dictiona ... -
Insert Interval
2016-03-08 02:11 378Given a set of non-overlapping ... -
Merge Intervals
2016-03-07 05:25 503Given a collection of intervals ... -
Merge k Sorted Lists
2016-03-07 04:03 568Merge k sorted linked lists and ... -
Multiply Strings
2016-03-06 07:27 482Given two numbers represented a ... -
N-Queens II
2016-03-06 03:06 666Follow up for N-Queens problem. ... -
N-Queens
2016-03-06 02:47 472The n-queens puzzle is the prob ... -
First Missing Positive
2016-03-05 03:09 432Given an unsorted integer array ... -
Spiral Matrix
2016-03-04 03:39 582Given a matrix of m x n element ... -
Trapping Rain Water
2016-03-04 02:54 590Given n non-negative integers r ... -
Repeated DNA Sequences
2016-03-03 03:10 429All DNA is composed of a series ... -
Increasing Triplet Subsequence
2016-03-02 02:48 904Given an unsorted array return ... -
Maximum Product of Word Lengths
2016-03-02 01:56 933Given a string array words, fin ... -
LRU Cache
2016-02-29 10:37 606Design and implement a data str ... -
Super Ugly Number
2016-02-29 07:07 690Write a program to find the nth ... -
Longest Increasing Path in a Matrix
2016-02-29 05:56 855Given an integer matrix, find t ... -
Coin Change
2016-02-29 04:39 788You are given coins of differen ... -
Minimum Height Trees
2016-02-29 04:11 721For a undirected graph with tre ...
相关推荐
- **Ambiguous operators need parentheses**: 模糊的运算符需要括号来明确优先级。 - **Ambiguous symbol 'xxx'**: 模糊的符号“xxx”,可能是因为命名冲突或作用域问题。 - **Argument list syntax error**: 参数...
合并排序数组, Valid Parentheses, 实现 strStr(), Set Matrix Zeroes, 搜索插入位置, Longest Consecutive Sequence, Valid Palindrome, 螺旋矩阵, 搜索一个二维矩阵, 旋转图像, 三角形, Distinct Subsequences ...
2.3parentheses 括号的优先级最高,括号中的表达式先计算。 3. 需求分析 需求分析是指对算术表达式的需求进行分析,以确定实验的目标和需求。需求分析包括输入的形式和输入值的范围、程序所能达到的功能等。 3.1...
例如,"有效的括号"(Valid Parentheses)要求检查一个字符串是否是有效的小括号序列。 4. **二叉树**:二叉树题目涉及到遍历、搜索、构造、平衡等问题。例如,"二叉树的最大路径和"(Maximum Path Sum)要求找到从...
本文档总结了数学术语的英文对照,包括代数、集合、代数式、方程、不等式、分数、小数、基本数学概念、数论、数列等方面的知识点。 从代数部分开始,包括有关数学运算的英文对照,如add、plus、subtract、multiply...
总结一下,就是:func 是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有 int*形参,返回值为 int 类型的函数。 5. int (*(*func)(int *p))[5]; func 是一个函数指针,这类函数具有 int*类型的...
总结一下,通过使用栈数据结构,我们可以高效地解决括号匹配问题。这个过程涉及到栈的基本操作,以及对字符串的遍历和字符的比较。在Java中,我们可以使用内置的`Stack`类,或者自定义栈类来实现。通过这样的算法,...
在`pyparsing`中,你可以定义一系列基本的解析元素,如单词(word)、数字(number)、括号(parentheses)等,然后通过组合这些元素来构建更复杂的解析规则。例如,可以创建一个解析表达式来解析算术表达式,或者...
本文总结了C语言编程时常见的错误提示,并对每个错误进行了详细的解释。 1. Ambiguous operators need parentheses 不明确的运算符需要括号 在C语言中,运算符的优先级可能会导致语法错误。例如,在某些情况下,...
- `info_type`参数的可选值包括"address"、"col"、"color"、"contents"、"filename"、"format"、"parentheses"、"prefix"、"protect"、"row"、"type"和"width"等,每种类型返回不同的信息。 - "address"返回单元格...
总结来说,解决括号配对问题的关键在于理解和应用栈这一数据结构,通过遍历输入字符串,按照括号的配对规则进行压栈和弹栈操作,最终判断括号是否匹配。这个问题不仅在面试和编程竞赛中常见,也是许多实际编程场景的...
总结 按照类别分类来刷 刷当前题的时候,看下『题目描述』最底下有个『相似题目』,这些题的思路大致也相当 通常都是看别人的面经,然后看到有LeetCode题,然后来刷,比如有些DP的题,看完当前的题的时候,可以把...
2. **Parentheses in method calls**: 2.7.0引入了可选的括号,使得方法调用更简洁,但同时保持了代码的可读性。 3. **New syntax for multiple assignment**: 引入了新的语法来处理多值赋值,使得代码更加简洁。 4....
总结,连续的四则运算在编程中无处不在,理解其运算规则、优先级和异常处理是每个程序员的基本功。无论是在简单的计算器应用,还是在复杂的科学计算中,正确理解和运用这些知识都是至关重要的。
8. **栈与队列**:"Valid Parentheses"(有效括号)和"Minimum Size Subarray Sum"(最小覆盖子数组)这类题目会用到栈和队列的特性来处理问题。 9. **位操作**:位操作是计算机科学的基础,题目如"Number of 1 ...
这个原则通常被称为“PEMDAS”或“BODMAS”,其中P代表括号(Parentheses),E代表指数(Exponents),MD代表乘法和除法(Multiplication and Division),AS代表加法和减法(Addition and Subtraction)。...
总结,C#中的算术运算符提供了基本的数学计算功能,包括加、减、乘、除、取余以及自增和自减。了解它们的用法和优先级对于编写任何C#程序都至关重要。通过实践这些例子,你可以更深入地掌握这些概念,并将其应用到...
Ambiguous operators need parentheses 在C语言中,运算符的优先级是固定的,但是有时候我们可能会不知道哪个运算符的优先级更高,这时候我们可以使用括号来明确运算符的优先级。例如,`a + b * c`可以写成`(a + b)...
本文总结了常见的C编译器错误信息,并对每个错误信息进行了中文翻译和解释。 1. Ambiguous operators need parentheses(不明确的运算需要用括号括起) C编译器错误信息中,Ambiguous operators need parentheses是...