您的位置:首页 > 其它

leetcode:Remove Invalid Parentheses

2016-02-13 11:09 387 查看
Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results.

Note: The input string may contain letters other than the parentheses
(
and
)
.

Examples:

"()())()" -> ["()()()", "(())()"]
"(a)())()" -> ["(a)()()", "(a())()"]
")(" -> [""]


Credits:

Special thanks to
@hpplayer for adding this problem and creating all test cases.

class Solution(object):

def isValid(self, s):

leftCount = 0
for c in s:
if c == '(':
leftCount = leftCount+1
elif c == ')':
if leftCount > 0:
leftCount = leftCount-1
else:
return False

if leftCount == 0:
return True
else:
return False

def removeInvalidParentheses(self, s):
"""
:type s: str
:rtype: List[str]
"""

q = [s]
ans = []
visited = set(q)

found = False

while len(q) > 0:
cur = q.pop(0)
if self.isValid(cur):
ans.append(cur)
found = True
elif not found:
for i in xrange(len(cur)):
if cur[i] == '(' or cur[i] == ')':
candidate = cur[:i] + cur[i+1:]

if candidate not in visited:
q.append(candidate)
visited.add(candidate)

return ans


BFS的思想,邻接节点是 比当前节点改变一个字节的节点
https://leetcode.com/discuss/67842/share-my-java-bfs-solution
public class Solution {
public List<String> removeInvalidParentheses(String s) {
List<String> res = new ArrayList<>();

// sanity check
if (s == null) return res;

Set<String> visited = new HashSet<>();
Queue<String> queue = new LinkedList<>();

// initialize
queue.add(s);
visited.add(s);

boolean found = false;

while (!queue.isEmpty()) {
s = queue.poll();

if (isValid(s)) {
// found an answer, add to the result
res.add(s);
found = true;
}

if (found) continue;

// generate all possible states
for (int i = 0; i < s.length(); i++) {
// we only try to remove left or right paren
if (s.charAt(i) != '(' && s.charAt(i) != ')') continue;

String t = s.substring(0, i) + s.substring(i + 1);

if (!visited.contains(t)) {
// for each state, if it's not visited, add it to the queue
queue.add(t);
visited.add(t);
}
}
}

return res;
}

// helper function checks if string s contains valid parantheses
boolean isValid(String s) {
int count = 0;

for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(') count++;
if (c == ')' && count-- == 0) return false;
}

return count == 0;
}
}


还有一个DFS思想的解法
https://leetcode.com/discuss/72208/easiest-9ms-java-solution
public List<String> removeInvalidParentheses(String s) {
Set<String> res = new HashSet<>();
int rmL = 0, rmR = 0;
for(int i = 0; i < s.length(); i++) {
if(s.charAt(i) == '(') rmL++;
if(s.charAt(i) == ')') {
if(rmL != 0) rmL--;
else rmR++;
}
}
DFS(res, s, 0, rmL, rmR, 0, new StringBuilder());
return new ArrayList<String>(res);
}

public void DFS(Set<String> res, String s, int i, int rmL, int rmR, int open, StringBuilder sb) {
if(i == s.length() && rmL == 0 && rmR == 0 && open == 0) {
res.add(sb.toString());
return;
}
if(i == s.length() || rmL < 0 || rmR < 0 || open < 0) return;

char c = s.charAt(i);
int len = sb.length();

if(c == '(') {
DFS(res, s, i + 1, rmL - 1, rmR, open, sb);
DFS(res, s, i + 1, rmL, rmR, open + 1, sb.append(c));

} else if(c == ')') {
DFS(res, s, i + 1, rmL, rmR - 1, open, sb);
DFS(res, s, i + 1, rmL, rmR, open - 1, sb.append(c));

} else {
DFS(res, s, i + 1, rmL, rmR, open, sb.append(c));
}

sb.setLength(len);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: