`

Parentheses总结

阅读更多
这篇文章总结leetcode中有关括号的问题,最简单的是判断输入的括号是否有效,例如“))”就不属于有效的括号,括号的题目无非是添加,删除,找到最长有效括号等。最长有效括号是一道DP问题,我们在DP总结中结合最长回文子串一起列出。下面列举几个基本的题目。

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

分享到:
评论

相关推荐

    C语言错误解释和总结

    - **Ambiguous operators need parentheses**: 模糊的运算符需要括号来明确优先级。 - **Ambiguous symbol 'xxx'**: 模糊的符号“xxx”,可能是因为命名冲突或作用域问题。 - **Argument list syntax error**: 参数...

    10个最常见的Java算法.doc

    合并排序数组, Valid Parentheses, 实现 strStr(), Set Matrix Zeroes, 搜索插入位置, Longest Consecutive Sequence, Valid Palindrome, 螺旋矩阵, 搜索一个二维矩阵, 旋转图像, 三角形, Distinct Subsequences ...

    数据结构 算术表达式

    2.3parentheses 括号的优先级最高,括号中的表达式先计算。 3. 需求分析 需求分析是指对算术表达式的需求进行分析,以确定实验的目标和需求。需求分析包括输入的形式和输入值的范围、程序所能达到的功能等。 3.1...

    Leetcode:LeetCode 刷题总结

    例如,"有效的括号"(Valid Parentheses)要求检查一个字符串是否是有效的小括号序列。 4. **二叉树**:二叉树题目涉及到遍历、搜索、构造、平衡等问题。例如,"二叉树的最大路径和"(Maximum Path Sum)要求找到从...

    数学术语英文对照.docx

    本文档总结了数学术语的英文对照,包括代数、集合、代数式、方程、不等式、分数、小数、基本数学概念、数论、数列等方面的知识点。 从代数部分开始,包括有关数学运算的英文对照,如add、plus、subtract、multiply...

    C语言指针的左右法制

    总结一下,就是:func 是一个指向数组的指针,这个数组的元素是函数指针,这些指针指向具有 int*形参,返回值为 int 类型的函数。 5. int (*(*func)(int *p))[5]; func 是一个函数指针,这类函数具有 int*类型的...

    stack实现括号匹配

    总结一下,通过使用栈数据结构,我们可以高效地解决括号匹配问题。这个过程涉及到栈的基本操作,以及对字符串的遍历和字符的比较。在Java中,我们可以使用内置的`Stack`类,或者自定义栈类来实现。通过这样的算法,...

    PyPI 官网下载 | pyparsing-2.4.5.tar.gz

    在`pyparsing`中,你可以定义一系列基本的解析元素,如单词(word)、数字(number)、括号(parentheses)等,然后通过组合这些元素来构建更复杂的解析规则。例如,可以创建一个解析表达式来解析算术表达式,或者...

    C语言常见错误提示

    本文总结了C语言编程时常见的错误提示,并对每个错误进行了详细的解释。 1. Ambiguous operators need parentheses 不明确的运算符需要括号 在C语言中,运算符的优先级可能会导致语法错误。例如,在某些情况下,...

    Excel函数——信息函数.pdf

    - `info_type`参数的可选值包括"address"、"col"、"color"、"contents"、"filename"、"format"、"parentheses"、"prefix"、"protect"、"row"、"type"和"width"等,每种类型返回不同的信息。 - "address"返回单元格...

    8_大小括号算术_栈_源码

    总结来说,解决括号配对问题的关键在于理解和应用栈这一数据结构,通过遍历输入字符串,按照括号的配对规则进行压栈和弹栈操作,最终判断括号是否匹配。这个问题不仅在面试和编程竞赛中常见,也是许多实际编程场景的...

    leetcode添加元素使和等于-leetcode:力码

    总结 按照类别分类来刷 刷当前题的时候,看下『题目描述』最底下有个『相似题目』,这些题的思路大致也相当 通常都是看别人的面经,然后看到有LeetCode题,然后来刷,比如有些DP的题,看完当前的题的时候,可以把...

    rubyinstaller-2.7.0-1-x64-1.rar

    2. **Parentheses in method calls**: 2.7.0引入了可选的括号,使得方法调用更简洁,但同时保持了代码的可读性。 3. **New syntax for multiple assignment**: 引入了新的语法来处理多值赋值,使得代码更加简洁。 4....

    连续的四则运算(加减乘除和括号)

    总结,连续的四则运算在编程中无处不在,理解其运算规则、优先级和异常处理是每个程序员的基本功。无论是在简单的计算器应用,还是在复杂的科学计算中,正确理解和运用这些知识都是至关重要的。

    leetcode常见的100热点算法题

    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#中的算术运算符提供了基本的数学计算功能,包括加、减、乘、除、取余以及自增和自减。了解它们的用法和优先级对于编写任何C#程序都至关重要。通过实践这些例子,你可以更深入地掌握这些概念,并将其应用到...

    C语言常见错误查询,查询运行时出现的错误

    Ambiguous operators need parentheses 在C语言中,运算符的优先级是固定的,但是有时候我们可能会不知道哪个运算符的优先级更高,这时候我们可以使用括号来明确运算符的优先级。例如,`a + b * c`可以写成`(a + b)...

    C编译器错误信息中文翻译

    本文总结了常见的C编译器错误信息,并对每个错误信息进行了中文翻译和解释。 1. Ambiguous operators need parentheses(不明确的运算需要用括号括起) C编译器错误信息中,Ambiguous operators need parentheses是...

Global site tag (gtag.js) - Google Analytics