helpstack

leetcode32(最长有效括号)--Java语言实现

喜欢而已 提交于 2020-08-14 09:02:17
求: 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()" 示例 2: 输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()" 题目链接: https://leetcode-cn.com/problems/longest-valid-parentheses/ 解: 1、利用栈 这道题是经典的栈应用:判断字符串左右括号是否能够匹配的变式,在判断左右括号能否匹配的时,我们将左括号入栈,然后每遇到右括号就出栈,最后判断栈是否为空,空代表匹配,不空代表不匹配。 在这道题里,因为我们要判断的是最大匹配的长度,因此入栈的元素应该是字符在数组里的索引。我们让栈底元素代表最后一个')'对应的索引(初始的时候栈底设置为-1),而栈里的其他元素则存放每一次遇到'('时的索引。然后我们如果遇到'('则将相应索引入栈,遇到')',弹出栈顶元素。如果发现栈为空,说明当前给出的是')',且')'的数量超过了'('的数量,将最新')'的索引入栈。如果栈不空,记录截止目前的匹配长度,最后在所有的匹配长度中,选取一个最大者返回。 时间复杂度:O(N) 空间复杂度:O(N) public int longestValidParentheses (String s) { Deque

leetcode剑指 Offer 06(从尾到头打印链表)--Java语言实现

∥☆過路亽.° 提交于 2020-08-11 22:57:24
求: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000 题目链接: https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/ 解: 非常常规的题目,因为题目的特点是先进后出,所以联想到栈,先遍历链表,将值放入栈中,最后再从栈中弹出元素,逐个加入ret数组。最后返回ret数组。 时间复杂度:O(n) 空间复杂度:O(n) public int [] reversePrint (ListNode head) { Deque<Integer> helpStack = new LinkedList<>() ; for (ListNode p = head ; p != null; p = p. next ) helpStack.push(p. val ) ; int size = helpStack.size() ; int ret[] = new int [size] ; for ( int k = 0 ; k < size ; k++) ret[k] = helpStack.pop() ; return ret ; } 如果不用栈也可以做,这样可以省去栈的空间