Compare commits
2 Commits
ec73b7d661
...
e6107b6dca
| Author | SHA1 | Date | |
|---|---|---|---|
| e6107b6dca | |||
| 6c9412cc14 |
@@ -0,0 +1,11 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
|
<RootNamespace>_10._Regular_Expression_Matching</RootNamespace>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
29
10. Regular Expression Matching/Program.cs
Normal file
29
10. Regular Expression Matching/Program.cs
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
var solution = new Solution();
|
||||||
|
|
||||||
|
var examples = new (string s, string p, bool expected)[]
|
||||||
|
{
|
||||||
|
("aa", "a", false),
|
||||||
|
("aa", "a*", true),
|
||||||
|
("ab", ".*", true),
|
||||||
|
("aab", "c*a*b", true),
|
||||||
|
("mississippi", "mis*is*p*.", false),
|
||||||
|
("mississippi", "mis*is*ip*.", true),
|
||||||
|
("aaa", "a*a", true),
|
||||||
|
("aaa", "ab*a*c*a", true),
|
||||||
|
("ab", ".*c", false),
|
||||||
|
("", "c*", true),
|
||||||
|
("abcd", "d*", false),
|
||||||
|
("", "", true),
|
||||||
|
("a", ".", true),
|
||||||
|
("", "a*", true),
|
||||||
|
("aa", "b*a*", true),
|
||||||
|
("a", "ab*", true),
|
||||||
|
("abcaaaaaaabaabcabac", ".*ab.a.*a*a*.*b*b*", true),
|
||||||
|
("", "a*b*", true),
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var example in examples)
|
||||||
|
{
|
||||||
|
var result = solution.IsMatch(example.s, example.p);
|
||||||
|
Console.WriteLine($"s = \"{example.s}\", p = \"{example.p}\" => {result} (expected {example.expected})");
|
||||||
|
}
|
||||||
59
10. Regular Expression Matching/Solution.cs
Normal file
59
10. Regular Expression Matching/Solution.cs
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public bool IsMatch(string s, string p) => IsMatch(null, s, p);
|
||||||
|
|
||||||
|
private bool IsMatch(char? prev, ReadOnlySpan<char> str, ReadOnlySpan<char> pattern)
|
||||||
|
{
|
||||||
|
if (pattern.Length == 0 && str.Length == 0)
|
||||||
|
return true;
|
||||||
|
if (str.Length == 0)
|
||||||
|
{
|
||||||
|
if (CanBeEmpty(pattern))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (pattern.Length == 0)
|
||||||
|
return false;
|
||||||
|
var sym = str[0];
|
||||||
|
var p = pattern[0];
|
||||||
|
// раскрытая звёздочка
|
||||||
|
var pSymOrDot = p == '*' ? prev : p; // превращаем звёздочку в символ или точку
|
||||||
|
// ожидаемый текущий символ, конкретный
|
||||||
|
var pSym = pSymOrDot == '.' ? sym : pSymOrDot;
|
||||||
|
|
||||||
|
|
||||||
|
// следующий символ *
|
||||||
|
if (pattern.Length > 1 && pattern[1] == '*')
|
||||||
|
{
|
||||||
|
var match = false;
|
||||||
|
var i = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
match |= IsMatch(i > 0 ? p : prev, str[i..], pattern[2..]);
|
||||||
|
if (match || i == str.Length || str[i] != p && p != '.')
|
||||||
|
break;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
while (i <= str.Length);
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
else if (sym != pSym)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return IsMatch(pSymOrDot, str[1..], pattern[1..]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool CanBeEmpty(ReadOnlySpan<char> pattern)
|
||||||
|
{
|
||||||
|
if (pattern.Length % 2 == 1)
|
||||||
|
return false;
|
||||||
|
for (var i = 1; i < pattern.Length; i += 2)
|
||||||
|
if (pattern[i] != '*')
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1 +1,18 @@
|
|||||||
Console.WriteLine("Hello, World!");
|
var sol = new Solution();
|
||||||
|
|
||||||
|
var cases = new (string input, string expected)[]
|
||||||
|
{
|
||||||
|
("babad", "bab"),
|
||||||
|
("cbbd", "bb"),
|
||||||
|
("a", "a"),
|
||||||
|
("ac", "a"),
|
||||||
|
("forgeeksskeegfor", "geeksskeeg"),
|
||||||
|
("abba", "abba"),
|
||||||
|
("racecar", "racecar")
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var (input, expected) in cases)
|
||||||
|
{
|
||||||
|
var actual = sol.LongestPalindrome(input);
|
||||||
|
Console.WriteLine($"{input} -> {actual} (expected: {expected})");
|
||||||
|
}
|
||||||
|
|||||||
56
5. Longest Palindromic Substring/Solutuion.cs
Normal file
56
5. Longest Palindromic Substring/Solutuion.cs
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
using System.Text;
|
||||||
|
|
||||||
|
public class Solution
|
||||||
|
{
|
||||||
|
public string LongestPalindrome(string s)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(s))
|
||||||
|
return "";
|
||||||
|
var str = PrepareString(s);
|
||||||
|
var radii = new int[str.Length];
|
||||||
|
var set = new HashSet<int>(); // Индексы радиусов для обработки
|
||||||
|
var answer = string.Empty;
|
||||||
|
|
||||||
|
for (var i = 0; i < str.Length; i++)
|
||||||
|
{
|
||||||
|
var sym = str[i];
|
||||||
|
var toRemove = new List<int>();
|
||||||
|
foreach (var radiusIdx in set)
|
||||||
|
{
|
||||||
|
var new_radius = radii[radiusIdx] + 1;
|
||||||
|
// Если с новым радиусом выходим за границы
|
||||||
|
if (radiusIdx - new_radius < 0 || radiusIdx + new_radius >= str.Length || str[radiusIdx - new_radius] != sym)
|
||||||
|
{
|
||||||
|
var len = radii[radiusIdx] * 2 + 1;
|
||||||
|
if (len > answer.Length)
|
||||||
|
answer = str.Substring(radiusIdx - radii[radiusIdx], len);
|
||||||
|
toRemove.Add(radiusIdx);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
radii[radiusIdx] = new_radius;
|
||||||
|
}
|
||||||
|
foreach (var removeIdx in toRemove)
|
||||||
|
set.Remove(removeIdx);
|
||||||
|
|
||||||
|
set.Add(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var radiusIdx in set)
|
||||||
|
{
|
||||||
|
var len = radii[radiusIdx] * 2 + 1;
|
||||||
|
if (len > answer.Length || answer == "#")
|
||||||
|
answer = str.Substring(radiusIdx - radii[radiusIdx], len);
|
||||||
|
}
|
||||||
|
|
||||||
|
return answer.Replace("#", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
public string PrepareString(string s)
|
||||||
|
{
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
sb.Append('#');
|
||||||
|
foreach (var ch in s)
|
||||||
|
sb.Append($"{ch}#");
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
14
Leetcode.sln
14
Leetcode.sln
@@ -177,6 +177,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "347. Top K Frequent Element
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "5. Longest Palindromic Substring", "5. Longest Palindromic Substring\5. Longest Palindromic Substring.csproj", "{8F972144-7AF8-4860-9A9F-AB56D40D7C67}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "5. Longest Palindromic Substring", "5. Longest Palindromic Substring\5. Longest Palindromic Substring.csproj", "{8F972144-7AF8-4860-9A9F-AB56D40D7C67}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "10. Regular Expression Matching", "10. Regular Expression Matching\10. Regular Expression Matching.csproj", "{0A6CECBE-AD75-4829-AAB2-D6D29EEECEB5}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -1231,6 +1233,18 @@ Global
|
|||||||
{8F972144-7AF8-4860-9A9F-AB56D40D7C67}.Release|x64.Build.0 = Release|Any CPU
|
{8F972144-7AF8-4860-9A9F-AB56D40D7C67}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{8F972144-7AF8-4860-9A9F-AB56D40D7C67}.Release|x86.ActiveCfg = Release|Any CPU
|
{8F972144-7AF8-4860-9A9F-AB56D40D7C67}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{8F972144-7AF8-4860-9A9F-AB56D40D7C67}.Release|x86.Build.0 = Release|Any CPU
|
{8F972144-7AF8-4860-9A9F-AB56D40D7C67}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{0A6CECBE-AD75-4829-AAB2-D6D29EEECEB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{0A6CECBE-AD75-4829-AAB2-D6D29EEECEB5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{0A6CECBE-AD75-4829-AAB2-D6D29EEECEB5}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{0A6CECBE-AD75-4829-AAB2-D6D29EEECEB5}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{0A6CECBE-AD75-4829-AAB2-D6D29EEECEB5}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{0A6CECBE-AD75-4829-AAB2-D6D29EEECEB5}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{0A6CECBE-AD75-4829-AAB2-D6D29EEECEB5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{0A6CECBE-AD75-4829-AAB2-D6D29EEECEB5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{0A6CECBE-AD75-4829-AAB2-D6D29EEECEB5}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{0A6CECBE-AD75-4829-AAB2-D6D29EEECEB5}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{0A6CECBE-AD75-4829-AAB2-D6D29EEECEB5}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{0A6CECBE-AD75-4829-AAB2-D6D29EEECEB5}.Release|x86.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
Reference in New Issue
Block a user