From eee9b167293783ca2da881f5681452e022f0cd12 Mon Sep 17 00:00:00 2001 From: 0xff-dev Date: Sun, 12 Jan 2025 18:36:58 +0800 Subject: [PATCH] Add solution and test-cases for problem 2116 --- .../1.png | Bin 0 -> 3379 bytes .../README.md | 46 ++++++++++++------ .../Solution.go | 37 +++++++++++++- .../Solution_test.go | 19 ++++---- 4 files changed, 77 insertions(+), 25 deletions(-) create mode 100644 leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/1.png diff --git a/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/1.png b/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/1.png new file mode 100644 index 0000000000000000000000000000000000000000..11fc2d2a0a27c7c54092e9b34ccbb8fa641c852a GIT binary patch literal 3379 zcmZ`+XI#@uv;GST3a=ul;6ae1QWOxW(j+P^Hy%y3jlsW0B}ZC`K<%MM_~ZidT!y}iBi^77u^-mgw6q*^-iy-QC@pnVFrPoz2b7goK3g@$ur~;_&eB{{H@ukdXK9-ya?xdU$v= zHa7nH^(!zi5Rb>#)zyuSjfIAWwzjrfTU$3bH)AjuFE6js($a~EiN3x*GMQ{|Z+~!b z;O*_bu&~h7)P%)ii;9X;Q&WS2g68Jt3JVLPqN2LHyVKIr9334S8X9bEZChGel9G~; zNMw3?dUA4dO-)T=Vj>QQLm&`KOG~Gxrv(KCQ&UrUd3hufDKj(k`}gkz0s)0Wt*@^; zIXPu#XGcUtEG{k{9UY~lqxLMcz8H2E-p7WHzOmXt*vc)d;9F{Y-?+4V`C#A zAfT(OD>gRP-{1fD@84NjS;xo6KYsi`qtRc#eqC8vadB~RaBy&Sb*-qV7#SG}4h|j~ z8gg@U`}XZyM@NUBpP#3v=iuOAOiWCCe0+3tG#n29{P{DrKxihO(b3Uqeh`}Fp@oHo zf`WpIii(z&7KT+|>8;aIW7|2IJaI?Z$jHdu-5taBc;{OdX=jf@Bq=H?PVvc-4-R+J z5p(i7`-oC)ZEeiWN6X90zP`Tg?d|I7>ZYcqIyyR4RaI+iYZ@9Fk&%(_-o2ZjpMUl0 z)&Bl|eSN);j}HU_dGqFtzP|oH|NNt@tV|>l4Gj&UP^g`qosyCg7!0ngtPBeaQ&Us> z@ZrP2z<{NtrJkN13Ps`Wbhl~Ocd{->U^NY%hHa8wYr_x+!EqcY!Y34gK%9+F z#zx-&@cYZ2KG2I#eEpMe7_6HtGgmS+!pvFqsy~NKzGhY$>9RAcPT+iFJ*f8TU?oc+ zs5nlbl%FLIDfHL~I%v*Z)cDg}DVHg$xX>#%rm`@vx*9Wm1)k@9Ea?0d&Giug{; z6%RK?IobLdFQ)pdR-kmTB? z?eae{zYUUEjNXx!QA_FG9kBhuam1_3E7Q-zF2J_R&7e>|?(@( z9oyQOo13eRkCz>h!mz-l>eXxPQ7{>_bQw= zx+jNqt&>16!1KvKx-41K}$Jjqnk$~=}E?%qecw9&2><-M=K z1i}f2x^`SK@-X<8DO=k4le^3-jjP{Kb5_+|lgK3<3mQlp582B|^)g7N?$uT>9IUsR zn-J4$U?`Uuro;mQ(u#QrxlHgzx^TCD!&pOAJwEc_i8Fj(8C3Jg7*q+yVqEhHMn?>z zsTr#wMULf+1|@->!DJ>LbyH7fqtNGsY8)E+!8G5q1eJ1I`HAJnG332^F0olqiPwqz zF8!3!@_FsHSY-)^OIs3WQW!QI&m~DKzR?+Gg)?i^+hY^iL@3MM68#fDl1uKYFfSiC zVdhV&cFnLa_z?Ow=a$>Y$jwY4@js3dZh|1?Le0^J&1f;^%J>HwlNIfYWI8hQ<`1Z! zEy$;WJIf3q_iNvQJf4rRF3#|X(OmzOQ4Ha#PW&GRA{w=fj6zX=r_CDcibIo3ljAvQ z*N{1LDZp)MR9k+AX)$65qnTn*%*%;e`!L$0IG_9VZ7SydK6i?aV%Zye9d)9#>`1*l~MfL zO500Yp?+B4Nb=g%!NHer1jA9(UIFnP&Rn7@gSl}SaT3k$BIq|HBJUyhxIM|(q)x#i z{R>F7=M_ZI4}4(>p508*I~2;TqD#Wb$%SK2`m7I%FF?6l(pZ^F^b_io2BPj_L~+ z+IxtOr0d1J^3F5bDsbk(iqPO^ejA`%H6IC?sOyLK#Vn)sAU#JUe|{UqNOK1PO(V9B{&9?K8iP_hC-WaUqn~+ti3=WOK55&m5PKz-*rPceBtg_{5 z>HUgr)&2YTXw4Navo=|xf~HMgPDj|j9vZ1-t}g?j`Cu!aqua2TD-i}s4Bjc%JMJ1j z#K_BcU5Cf2q%rsQak9&5$@eg-@|3d-U)P>rkB~~D`T1PAN194+LpqP9;3sG0V&v~E zkzoNam}pi0P(CLI5B;l}d&^Y>JYt;mc;F*_z|7kIbb!a*k8U9FkIlH~BPpr7!>5J) ze!+2w1&3ZsX=Fe9s=e`Akr3?%)Kt57 z_Vi@;&D=z>*VS7eXBEh@a87A}gXIslYD^EwcPU+Sayy)Zyu`5qzpbKoiKL73h(=I6 z0TNDpzq~0*1;Dq1s#NncSOBH4sXfB_^p)1IA5#?ZN69$!et*xfmW$r3{sX;ll?Lk_y7`%9E*937DkFs~xY%c%A9UR0$326)RJ2);J~GY0nei z8}KyKom}Nd{+nd#REYI@RMYI0Jw+y6-2_iQ@O`#sY>w>o%$FPZJI&A48F+mpB4V&K zq-(eI(LNG!A4P~G2~4i^Pt{6^+Z1uSNfi6*-n|QyeXyGGEh>NGRsqiD`RGw!hpAf1 z#;`SGSr;dwu~a!r=tja#-L$G@Ta7*e!1uIB3Ry@k&}JO4d+zT`lx-1ct1a9sdR3rG zbHcO4^`!OrIZx>SRym}1t?(R*N1qFGx!VoAx`spNqZ7r3mNMV2o~xVC{q{;SX>OuB zc1-?>}KSh!kI1t2OcD)LxF#3IHHV8j48yw*mhJXDIDE literal 0 HcmV?d00001 diff --git a/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/README.md b/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/README.md index 9448f27aa..4b3a8a33e 100755 --- a/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/README.md +++ b/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/README.md @@ -1,28 +1,46 @@ # [2116.Check if a Parentheses String Can Be Valid][title] -> [!WARNING|style:flat] -> This question is temporarily unanswered if you have good ideas. Welcome to [Create Pull Request PR](https://github.com/kylesliu/awesome-golang-algorithm) - ## Description +A parentheses string is a **non-empty** string consisting only of `'('` and `')'`. It is valid if **any** of the following conditions is **true**: + +- It is `()`. +- It can be written as `AB` (`A` concatenated with `B`), where `A` and `B` are valid parentheses strings. +- It can be written as `(A)`, where `A` is a valid parentheses string. + +You are given a parentheses string `s` and a string `locked`, both of length `n`. `locked` is a binary string consisting only of `'0'`s and `'1'`s. For **each** index `i` of `locked`, + +- If `locked[i]` is `'1'`, you **cannot** change `s[i]`. +- But if `locked[i]` is `'0'`, you **can** change `s[i]` to either `'('` or `')'`. + +Return `true` if you can make `s` a valid parentheses string. Otherwise, return `false`. + +**Example 1:** -**Example 1:** +![1](./1.png) ``` -Input: a = "11", b = "1" -Output: "100" +Input: s = "))()))", locked = "010100" +Output: true +Explanation: locked[1] == '1' and locked[3] == '1', so we cannot change s[1] or s[3]. +We change s[0] and s[4] to '(' while leaving s[2] and s[5] unchanged to make s valid. ``` -## 题意 -> ... +**Example 2:** -## 题解 - -### 思路1 -> ... -Check if a Parentheses String Can Be Valid -```go ``` +Input: s = "()()", locked = "0000" +Output: true +Explanation: We do not need to make any changes because s is already valid. +``` + +**Example 3:** +``` +Input: s = ")", locked = "0" +Output: false +Explanation: locked permits us to change s[0]. +Changing s[0] to either '(' or ')' will not make s valid. +``` ## 结语 diff --git a/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/Solution.go b/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/Solution.go index d115ccf5e..350e0b612 100644 --- a/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/Solution.go +++ b/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/Solution.go @@ -1,5 +1,38 @@ package Solution -func Solution(x bool) bool { - return x +func Solution(s string, locked string) bool { + l := len(s) + if l&1 == 1 { + return false + } + stack1, stack2 := make([]int, l), make([]int, l) + i1, i2 := -1, -1 + for i, b := range s { + if locked[i] == '0' { + i1++ + stack1[i1] = i + continue + } + if b == '(' { + i2++ + stack2[i2] = i + continue + } + if i2 != -1 { + i2-- + continue + } + if i1 != -1 { + i1-- + continue + } + return false + } + for i2 >= 0 && i1 >= 0 { + if stack2[i2] > stack1[i1] { + break + } + i2, i1 = i2-1, i1-1 + } + return i2 == -1 } diff --git a/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/Solution_test.go b/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/Solution_test.go index 14ff50eb4..d13eec50a 100644 --- a/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/Solution_test.go +++ b/leetcode/2101-2200/2116.Check-if-a-Parentheses-String-Can-Be-Valid/Solution_test.go @@ -10,30 +10,31 @@ func TestSolution(t *testing.T) { // 测试用例 cases := []struct { name string - inputs bool + inputs string + locked string expect bool }{ - {"TestCase", true, true}, - {"TestCase", true, true}, - {"TestCase", false, false}, + {"TestCase1", "))()))", "010100", true}, + {"TestCase2", "()()", "0000", true}, + {"TestCase3", ")", "0", false}, } // 开始测试 for i, c := range cases { t.Run(c.name+" "+strconv.Itoa(i), func(t *testing.T) { - got := Solution(c.inputs) + got := Solution(c.inputs, c.locked) if !reflect.DeepEqual(got, c.expect) { - t.Fatalf("expected: %v, but got: %v, with inputs: %v", - c.expect, got, c.inputs) + t.Fatalf("expected: %v, but got: %v, with inputs: %v %v", + c.expect, got, c.inputs, c.locked) } }) } } -// 压力测试 +// 压力测试 func BenchmarkSolution(b *testing.B) { } -// 使用案列 +// 使用案列 func ExampleSolution() { }