前言
需要栈的地方,不一定需要真正的栈,可以用数组等来模拟栈,做到真正的见招拆招。
一、移除无效的括号
二、用数组模拟栈
package everyday.medium;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
// 移除无效括号
public class MinRemoveToMakeValid {
/*
target:删除其中多余的括号,或不匹配的括号。
*/
public String minRemoveToMakeValid(String s) {
List<Integer> left = new ArrayList<>();// 代表左括号,存入它们的位置。
List<Integer> invalid = new ArrayList<>();// 无效的右括号,存入它们的位置。
int idx = 0;
for (char c : s.toCharArray()) {
if (c == '(') left.add(idx);
if (c == ')') {
if (left.size() > 0) left.remove(left.size() - 1);
else invalid.add(idx);
}
// for cycle
++idx;
}
// 筛选字符
Set<Integer> invalidPos = new HashSet<>(left);
invalidPos.addAll(invalid);
StringBuilder sb = new StringBuilder();
idx = 0;
for (char c : s.toCharArray()) if (!invalidPos.contains(idx++)) sb.append(c);
// 返回有效字符。
return sb.toString();
}
}
总结
1)用数组模拟栈,在数组尾加入元素是入栈,移除数组尾的元素表示出栈。
参考文献
[1] LeetCode 移除无效的括号