mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-05 00:25:22 +08:00
Merge pull request #176 from gostool/leetcode0301
add: leetcode 0301 solution
This commit is contained in:
@ -0,0 +1,69 @@
|
||||
package leetcode
|
||||
|
||||
var (
|
||||
res []string
|
||||
mp map[string]int
|
||||
n int
|
||||
length int
|
||||
maxScore int
|
||||
str string
|
||||
)
|
||||
|
||||
func removeInvalidParentheses(s string) []string {
|
||||
lmoves, rmoves, lcnt, rcnt := 0, 0, 0, 0
|
||||
for _, v := range s {
|
||||
if v == '(' {
|
||||
lmoves++
|
||||
lcnt++
|
||||
} else if v == ')' {
|
||||
if lmoves != 0 {
|
||||
lmoves--
|
||||
} else {
|
||||
rmoves++
|
||||
}
|
||||
rcnt++
|
||||
}
|
||||
}
|
||||
n = len(s)
|
||||
length = n - lmoves - rmoves
|
||||
res = []string{}
|
||||
mp = make(map[string]int)
|
||||
maxScore = min(lcnt, rcnt)
|
||||
str = s
|
||||
backtrace(0, "", lmoves, rmoves, 0)
|
||||
return res
|
||||
}
|
||||
|
||||
func backtrace(i int, cur string, lmoves int, rmoves int, score int) {
|
||||
if lmoves < 0 || rmoves < 0 || score < 0 || score > maxScore {
|
||||
return
|
||||
}
|
||||
if lmoves == 0 && rmoves == 0 {
|
||||
if len(cur) == length {
|
||||
if _, ok := mp[cur]; !ok {
|
||||
res = append(res, cur)
|
||||
mp[cur] = 1
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
if i == n {
|
||||
return
|
||||
}
|
||||
if str[i] == '(' {
|
||||
backtrace(i+1, cur+string('('), lmoves, rmoves, score+1)
|
||||
backtrace(i+1, cur, lmoves-1, rmoves, score)
|
||||
} else if str[i] == ')' {
|
||||
backtrace(i+1, cur+string(')'), lmoves, rmoves, score-1)
|
||||
backtrace(i+1, cur, lmoves, rmoves-1, score)
|
||||
} else {
|
||||
backtrace(i+1, cur+string(str[i]), lmoves, rmoves, score)
|
||||
}
|
||||
}
|
||||
|
||||
func min(a, b int) int {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
package leetcode
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type question301 struct {
|
||||
para301
|
||||
ans301
|
||||
}
|
||||
|
||||
// s 是参数
|
||||
type para301 struct {
|
||||
s string
|
||||
}
|
||||
|
||||
// ans 是答案
|
||||
type ans301 struct {
|
||||
ans []string
|
||||
}
|
||||
|
||||
func Test_Problem301(t *testing.T) {
|
||||
|
||||
qs := []question301{
|
||||
|
||||
{
|
||||
para301{"()())()"},
|
||||
ans301{[]string{"(())()", "()()()"}},
|
||||
},
|
||||
|
||||
{
|
||||
para301{"(a)())()"},
|
||||
ans301{[]string{"(a())()", "(a)()()"}},
|
||||
},
|
||||
|
||||
{
|
||||
para301{")("},
|
||||
ans301{[]string{""}},
|
||||
},
|
||||
}
|
||||
|
||||
fmt.Printf("------------------------Leetcode Problem 301------------------------\n")
|
||||
|
||||
for _, q := range qs {
|
||||
_, p := q.ans301, q.para301
|
||||
fmt.Printf("【input】:%v 【output】:%v\n", p, removeInvalidParentheses(p.s))
|
||||
}
|
||||
fmt.Printf("\n\n\n")
|
||||
}
|
55
leetcode/0301.Remove-Invalid-Parentheses/README.md
Normal file
55
leetcode/0301.Remove-Invalid-Parentheses/README.md
Normal file
@ -0,0 +1,55 @@
|
||||
# [301. Remove Invalid Parentheses](https://leetcode-cn.com/problems/remove-invalid-parentheses/)
|
||||
|
||||
|
||||
## 题目
|
||||
|
||||
Given a string s that contains parentheses and letters, remove the minimum number of invalid parentheses to make the input string valid.
|
||||
|
||||
Return all the possible results. You may return the answer in any order.
|
||||
|
||||
**Example 1:**
|
||||
|
||||
Input: s = "()())()"
|
||||
Output: ["(())()","()()()"]
|
||||
|
||||
**Example 2:**
|
||||
|
||||
Input: s = "(a)())()"
|
||||
Output: ["(a())()","(a)()()"]
|
||||
|
||||
**Example 3:**
|
||||
|
||||
Input: s = ")("
|
||||
Output: [""]
|
||||
|
||||
**Constraints:**
|
||||
|
||||
- 1 <= s.length <= 25
|
||||
- s consists of lowercase English letters and parentheses '(' and ')'.
|
||||
- There will be at most 20 parentheses in s.
|
||||
|
||||
## 题目大意
|
||||
|
||||
给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。
|
||||
|
||||
返回所有可能的结果。答案可以按 任意顺序 返回。
|
||||
|
||||
说明:
|
||||
|
||||
- 1 <= s.length <= 25
|
||||
- s 由小写英文字母以及括号 '(' 和 ')' 组成
|
||||
- s 中至多含 20 个括号
|
||||
|
||||
|
||||
## 解题思路
|
||||
|
||||
回溯和剪枝
|
||||
- 计算最大得分数maxScore,合法字符串的长度length,左括号和右括号的移除次数lmoves,rmoves
|
||||
- 加一个左括号的得分加1;加一个右括号的得分减1
|
||||
- 对于一个合法的字符串,左括号等于右括号,得分最终为0;
|
||||
- 搜索过程中出现以下任何一种情况都直接返回
|
||||
- 得分值为负数
|
||||
- 得分大于最大得分数
|
||||
- 得分小于0
|
||||
- lmoves小于0
|
||||
- rmoves小于0
|
Reference in New Issue
Block a user