diff --git a/32. Longest Valid Parentheses/32. Longest Valid Parentheses.csproj b/32. Longest Valid Parentheses/32. Longest Valid Parentheses.csproj
new file mode 100644
index 0000000..6585f82
--- /dev/null
+++ b/32. Longest Valid Parentheses/32. Longest Valid Parentheses.csproj
@@ -0,0 +1,11 @@
+
+
+
+ Exe
+ net10.0
+ _32._Longest_Valid_Parentheses
+ enable
+ enable
+
+
+
diff --git a/32. Longest Valid Parentheses/Program.cs b/32. Longest Valid Parentheses/Program.cs
new file mode 100644
index 0000000..6131fcc
--- /dev/null
+++ b/32. Longest Valid Parentheses/Program.cs
@@ -0,0 +1,5 @@
+var sol = new Solution();
+
+// System.Console.WriteLine(sol.LongestValidParentheses(")()())"));
+// System.Console.WriteLine(sol.LongestValidParentheses("()(()"));
+System.Console.WriteLine(sol.LongestValidParentheses("()(())"));
\ No newline at end of file
diff --git a/32. Longest Valid Parentheses/Solution.cs b/32. Longest Valid Parentheses/Solution.cs
new file mode 100644
index 0000000..a9627ac
--- /dev/null
+++ b/32. Longest Valid Parentheses/Solution.cs
@@ -0,0 +1,43 @@
+public class Solution
+{
+ struct Item
+ {
+ public char Sym;
+ public int Count;
+ public char? PrevSym;
+ }
+
+ public int LongestValidParentheses(string s)
+ {
+ var stack = new Stack- ();
+ var answer = 0;
+ foreach (var ch in s)
+ {
+ if (stack.Count > 0 && (stack.Peek().Sym == '(' || stack.Peek().PrevSym == '(') && ch == ')')
+ {
+ var prev = stack.Pop();
+ var count = 2;
+ if (prev.Sym == '#')
+ {
+ stack.Pop();
+ count += prev.Count;
+ }
+ while (stack.Count > 0 && stack.Peek().Sym == '#')
+ count += stack.Pop().Count;
+ char? prevSym = null;
+ if (stack.Count > 0)
+ prevSym = stack.Peek().Sym;
+ stack.Push(new Item() { Sym = '#', Count = count, PrevSym = prevSym });
+ answer = Math.Max(answer, count);
+ }
+ else
+ {
+ stack.Push(new Item() { Sym = ch, Count = 0 });
+
+
+ }
+ }
+
+ return answer;
+ }
+}
\ No newline at end of file
diff --git a/Leetcode.sln b/Leetcode.sln
index ea36914..172e7be 100644
--- a/Leetcode.sln
+++ b/Leetcode.sln
@@ -191,6 +191,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "26. Remove Duplicates from
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "31. Next Permutation", "31. Next Permutation\31. Next Permutation.csproj", "{DC76DEDE-AF9D-429B-B53B-204E89E90EA0}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "32. Longest Valid Parentheses", "32. Longest Valid Parentheses\32. Longest Valid Parentheses.csproj", "{9BD247FC-E91E-4FBD-9E97-6B917E4606D2}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -1329,6 +1331,18 @@ Global
{DC76DEDE-AF9D-429B-B53B-204E89E90EA0}.Release|x64.Build.0 = Release|Any CPU
{DC76DEDE-AF9D-429B-B53B-204E89E90EA0}.Release|x86.ActiveCfg = Release|Any CPU
{DC76DEDE-AF9D-429B-B53B-204E89E90EA0}.Release|x86.Build.0 = Release|Any CPU
+ {9BD247FC-E91E-4FBD-9E97-6B917E4606D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9BD247FC-E91E-4FBD-9E97-6B917E4606D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9BD247FC-E91E-4FBD-9E97-6B917E4606D2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9BD247FC-E91E-4FBD-9E97-6B917E4606D2}.Debug|x64.Build.0 = Debug|Any CPU
+ {9BD247FC-E91E-4FBD-9E97-6B917E4606D2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9BD247FC-E91E-4FBD-9E97-6B917E4606D2}.Debug|x86.Build.0 = Debug|Any CPU
+ {9BD247FC-E91E-4FBD-9E97-6B917E4606D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9BD247FC-E91E-4FBD-9E97-6B917E4606D2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9BD247FC-E91E-4FBD-9E97-6B917E4606D2}.Release|x64.ActiveCfg = Release|Any CPU
+ {9BD247FC-E91E-4FBD-9E97-6B917E4606D2}.Release|x64.Build.0 = Release|Any CPU
+ {9BD247FC-E91E-4FBD-9E97-6B917E4606D2}.Release|x86.ActiveCfg = Release|Any CPU
+ {9BD247FC-E91E-4FBD-9E97-6B917E4606D2}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE