美文网首页算法
LeetCode1021.两数相加

LeetCode1021.两数相加

作者: Timmy_zzh | 来源:发表于2021-07-21 11:02 被阅读0次
1.题目描述
  • 有效括号字符串为空 ""、"(" + A + ")" 或 A + B ,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。

    例如,"","()","(())()" 和 "(()(()))" 都是有效的括号字符串。
    如果有效字符串 s 非空,且不存在将其拆分为 s = A + B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。

    给出一个非空有效字符串 s,考虑将其进行原语化分解,使得:s = P_1 + P_2 + ... + P_k,其中 P_i 是有效括号字符串原语。

    对 s 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 s .

示例 1:
输入:s = "(()())(())"
输出:"()()()"
解释:
输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。

示例 2:
输入:s = "(()())(())(()(()))"
输出:"()()()()(())"
解释:
输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))",
删除每个部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。

示例 3:
输入:s = "()()"
输出:""
解释:
输入字符串为 "()()",原语化分解得到 "()" + "()",
删除每个部分中的最外层括号后得到 "" + "" = ""。

提示:
1 <= s.length <= 105
s[i] 为 '(' 或 ')'
s 是一个有效括号字符串

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-outermost-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.解题思路
  • 先找到原始括号字符串分解的位置,得到原语字符串,去除外层括号后,进行拼接到StringBuild中

    • 分解位置的特点是左右括号相同,可以使用计数器记录左右括号的数量
    • 遍历到做括号计数器+1,遇到右括号计数器-1,当计数器为0时当前遍历位置为分解点
    • 分局分解位置进行字符串的截取,截取子串存放到sb中
  • 2.1.计数器解法:

    public String removeOuterParentheses_v1(String s) {
        StringBuilder result = new StringBuilder();
        int count = 0;
        int lastIndex = 0;

        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (ch == '(') {
                count++;
            } else {
                count--;
            }
            if (count == 0) {
                result.append(s.substring(lastIndex + 1, i));
                lastIndex = i + 1;
            }
        }
        return result.toString();
    }
  • 2.2.使用栈进行存储法
/**
 * 2.使用栈进行数据保存
 * -遍历字符串,当遍历到左括号-入栈,遇到右括号-出栈,当栈为空时遍历位置为分解点,进行切分截取操作
 */
public String removeOuterParentheses_v2(String s) {
    Stack<Character> stack = new Stack<>();
    StringBuilder result = new StringBuilder();
    int lastIndex = 0;

    for (int i = 0; i < s.length(); i++) {
        char ch = s.charAt(i);
        if (ch == '(') {
            stack.push(ch);
        } else {
            stack.pop();
        }
        if (stack.isEmpty()) {
            result.append(s.substring(lastIndex + 1, i));
            lastIndex = i + 1;
        }
    }
    return result.toString();
}
  • 2.3.(最优解)使用一个计数器标示解法
/**
 * 2。定义int index = 0;变量表示左右括号的数量
 * -遇到左括号index++, index>0 需要将遍历字符添加到结果集中
 * -遇到右括号index--, index>0 也是原语中的字符
 */
public String removeOuterParentheses(String s) {
    StringBuilder result = new StringBuilder();
    int index = 0;
    char[] chars = s.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        char ch = chars[i];
        if (ch == '(') {
            if (index > 0) {
                result.append(ch);
            }
            index++;
        } else {
            index--;
            if (index > 0) {
                result.append(ch);
            }
        }
    }
    return result.toString();
}
3.总结
  • 解法总结
    • 找到有效括号字符串的分界点,得到原语子串,获取子串内的字符并保存到结果sb中
    • 在寻找分界点时,可以使用计数器和栈结构进行数据的存储
  • 栈结构总结:
    • 后进先出数据结构,常用于数据匹配场景

相关文章

  • LeetCode1021.两数相加

    1.题目描述 有效括号字符串为空 ""、"(" + A + ")" 或 A + B ,其中 A 和 B 都是有效的...

  • 两数相加

    题目 You are given two non-empty linked lists representing ...

  • 两数相加

    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表...

  • 两数相加

    两数相加 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一...

  • 两数相加

    两数相加: 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回...

  • 两数相加

    题目 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新...

  • 两数相加

    题目描述: 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回...

  • 两数相加

    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表...

  • 两数相加

    问题链接:https://leetcode-cn.com/explore/interview/card/top-i...

  • 两数相加

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只...

网友评论

    本文标题:LeetCode1021.两数相加

    本文链接:https://www.haomeiwen.com/subject/czfjmltx.html