add: leetcode 0301 solution

This commit is contained in:
tphyhFighting
2021-10-27 12:36:07 +08:00
parent af654b2e51
commit 7d08f48786
3 changed files with 174 additions and 0 deletions

View File

@ -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
}

View File

@ -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")
}

View 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