首页 > 编程语言 >【算法】算法练习之最长有效括号和两个删除

【算法】算法练习之最长有效括号和两个删除

时间:2022-10-22 13:31:47浏览次数:48  
标签:right nums int 练习 括号 算法 valid 数组 left

image.png

算法内容

1.最长有效括号,题目类型:栈,字符串,比较困难 2.删除有序数组中的重复项,题目类型:数组,双指针,比较简单 3.删除有效括号,题目类型:字符串,优先搜索,比较困难

题目描述

第一题最长有效括号题目描述

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例 1:

输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()"

示例 2:

输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()"

示例 3:

输入:s = "" 输出:0

提示:

0 <= s.length <= 3 * 104 s[i] 为 '(' 或 ')'

以下Java程序实现了这一功能,请你填补空白处内容:

import java.util.*;
class Solution {
	public int longestValidParentheses(String s) {
		int left = 0, right = 0, max = 0;
		for (int i = 0; i < s.length(); i++) {
			if (s.charAt(i) == '(')
				left++;
			else
				right++;
			if (left == right)
				max = Math.max(max, left * 2);
			if (right > left)
				left = right = 0;
		}
		left = 0;
		right = 0;
		for (int i = s.length() - 1; i >= 0; i--) {
			__________________;
			if (left == right)
				max = Math.max(max, left * 2);
			if (right < left)
				left = right = 0;
		}
		return max;
	}
}

Java代码解答如下

if (s.charAt(i) == '(')
	left++;
else
	right++;

第二题删除有序数组中的重复项题目描述

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下: // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 int len = removeDuplicates(nums); // 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。

for (int i = 0; i < len; i++) {
    print(nums[i]);
}

示例 1: 输入:nums = [1,1,2] 输出:2, nums = [1,2] 解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

示例 2: 输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

提示: 0 <= nums.length <= 3 * 104 -104 <= nums[i] <= 104 nums 已按升序排列

Java代码解答如下

class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int a = 0;
        for (int b = 1; b < nums.length; b++) {
            if (nums[a] != nums[b]) {
                a++;
                nums[a] = nums[b];
            }
        }
        return a + 1;
    }
}

第三题 删除有效括号 题目描述

给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。 返回所有可能的结果。答案可以按 任意顺序 返回。

示例 1:

输入:s = "()())()" 输出:["(())()","()()()"]

示例 2:

输入:s = "(a)())()" 输出:["(a())()","(a)()()"]

示例 3:

输入:s = ")(" 输出:[""]

提示:

1 <= s.length <= 25 s 由小写英文字母以及括号 '(' 和 ')' 组成 s 中至多含 20 个括号

Java代码解答如下

public class Solution {
    private Set<String> set;
    private String input;
    private int maxLen = 0;
    public List<String> removeInvalidParentheses(String s) {
        set = new HashSet<>();
        input = s;
        removeInvalidParentheses(0, "", 0, 0);
        return new ArrayList<>(set);
    }
    private void removeInvalidParentheses(int index, String valid, int leftCount, int rightCount) {
        if (leftCount < rightCount) {
            return;
        }
        if (index == input.length()) {
            if (leftCount == rightCount) {
                if (maxLen < valid.length()) {
                    maxLen = valid.length();
                    set.clear();
                    set.add(valid);
                } else if (maxLen == valid.length()) {
                    set.add(valid);
                }
            }
            return;
        }
        char c = input.charAt(index);
        if (c == '(') {
            removeInvalidParentheses(index + 1, valid, leftCount, rightCount);
            removeInvalidParentheses(index + 1, valid + c, leftCount + 1, rightCount);
        } else if (c == ')') {
            removeInvalidParentheses(index + 1, valid, leftCount, rightCount);
            removeInvalidParentheses(index + 1, valid + c, leftCount, rightCount + 1);
        } else {
            removeInvalidParentheses(index + 1, valid + c, leftCount, rightCount);
        }
    }
}

 

标签:right,nums,int,练习,括号,算法,valid,数组,left
From: https://blog.51cto.com/u_15312559/5785807

相关文章