题目
有一串字符串里面有很多不规则的小括号"()",现需要使用Java语言编写一段程序,删除尽可能少的括号,使得 字符串里面的括号匹配。
思路
将该字符串转换为字符数组,如果碰到“(”,则将其下标在集合储存起来,当碰到“)”,则从集合中取出一个下标。当集合为空时,再遇到“)”时,则说明该“)”找不出对应的“(”与之匹配,则存储在集合2中。
遍历完一次字符数组后,如果集合不为空,则里面的数据应该都移除,与之前找不到匹配的“)”一同存储到集合2中,将集合2中所有的下标都从字符数组中移除则得到结果。
复杂度
时间复杂度与空间复杂度都为O(n).
设计与实现
根据思路可得,这是一个堆结构的使用的算法。
使用List集合储存字符数组“(”的下标,当遇到“)”时候,则从List集合中移除一个下标。
使用Set集合存储不匹配的")"的下标与遍历完数组List集中的所有下标。
最后将Set结合中所有的下标都从字符数组中移除,再将剩余下标组合成一个新的字符串,则得到结果。
public String remove(String s) {
if (null == s || (!s.contains("(") && !s.contains(")")))
return s;
char[] array = s.toCharArray();
List<Integer> list = new ArrayList<Integer>();
Set<Integer> set = new HashSet<Integer>();
for (int i = 0; i < array.length; i++) {
if ('(' == array[i]) {
list.add(i);
} else if (')' == array[i]) {
if (list.isEmpty()) {
set.add(i);
} else {
list.remove(list.size() - 1);
}
}
}
set.addAll(list);
StringBuffer sBuffer = new StringBuffer(array.length);
for (int i = 0; i < array.length; i++) {
if (!set.contains(i)) {
sBuffer.append(array[i]);
}
}
return sBuffer.toString();
}
测试结果
输入
s = “a(b(cd(e)fgh)it(”
输出
“ab(cd(e)fgh)it”