使用 boolean valid(String s) 判断字符串 s 是否是合法的括号字符串。
public static boolean isValid(String s) {
int l = 0;
for (int i = 0; i < s.length(); i++) {
int temp = s.charAt(i);
if (temp == '(')
l++;
else if (temp == ')') {
if (l > 0)
l--;
else
return false;
}
}
return l == 0;
}
然后暴力遍历所有可以裁剪的情况。
将裁剪后的字符串和中间过程字符串存放在一个队列中,若裁剪后得到的字符串是合法的括号字符串,则将其放入结果集合中,若裁剪后仍不合法,则放入队列中继续迭代。
while (!queue.isEmpty()) { // 如果队列非空
String temp = queue.poll();
if (isValid(temp)) {
result.add(temp);
found = true;
}
if (found)// 推出裁剪,不再进一步裁剪,保证最少的更改次数
continue;
// 裁剪
for (int i = 0; i < temp.length(); i++) {
if (temp.charAt(i) == '(' || temp.charAt(i) == ')') { // 对括号进行裁剪
String str; // 裁剪后的字符串
if (i == temp.length()-1) {
str = temp.substring(0, temp.length()-1);
} else {
str = temp.substring(0, i) + temp.substring(i+1);
}
if (set.add(str)) {
// 如果集合中还没有出现过该字符串,则添加进队列
queue.offer(str);
}
}
}
}