3474. Lexicographically Smallest Generated String

This commit is contained in:
2026-04-01 11:28:34 +03:00
parent 3b9bbfe3db
commit 3d490d6027
4 changed files with 121 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>_3474._Lexicographically_Smallest_Generated_String</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,9 @@
var sol = new Solution();
// System.Console.WriteLine($"TFTF | ab -> \"{sol.GenerateString("TFTF", "ab")}\"");
// System.Console.WriteLine($"TFTF | abc -> \"{sol.GenerateString("TFTF", "abc")}\"");
// System.Console.WriteLine($"F | d -> \"{sol.GenerateString("F", "d")}\"");
// System.Console.WriteLine($"F | da -> \"{sol.GenerateString("F", "da")}\"");
// System.Console.WriteLine($"FT | da -> \"{sol.GenerateString("FT", "aghbdfhf")}\"");
// System.Console.WriteLine($"TFFFTFFF | bab -> \"{sol.GenerateString("TFFFTFFF", "bab")}\"");
System.Console.WriteLine($"TFT | xx -> \"{sol.GenerateString("TFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFTFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFTFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFT", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")}\"");

View File

@@ -0,0 +1,87 @@
using System.Text;
public class Solution
{
public string GenerateString(string str1, string str2)
{
var len = str1.Length + str2.Length - 1;
var answer = new char[len];
// Сначала обработать все T
for (var i = 0; i < str1.Length; i++)
{
if (str1[i] == 'T')
{
var sbIdx = i;
for (var j = 0; j < str2.Length; j++)
{
if (answer[sbIdx] != 0 && answer[sbIdx] != str2[j])
return "";
answer[sbIdx++] = str2[j];
}
}
}
// Теперь обработать все F
var canChange = new bool[len];
var lastF = -1;
for (var i = 0; i < str1.Length; i++)
if (str1[i] == 'F')
{
if (ProcessF(answer.AsSpan()[i..(i + str2.Length)], str2, canChange.AsSpan()[i..(i + str2.Length)], out var goBack) == false)
return "";
if(goBack && lastF != -1)
i = lastF - 1;
else
lastF = i;
}
return new string(answer);
}
private bool ProcessF(Span<char> chars, string s2, Span<bool> canChange, out bool goBack)
{
goBack = false;
var equal = true;
var emptyCount = 0;
var hasDiff = false;
var lastCanChange = -1;
for (var i = 0; i < s2.Length; i++)
{
equal &= chars[i] == s2[i];
if (chars[i] == 0)
emptyCount++;
else if (chars[i] != s2[i])
hasDiff = true;
if (canChange[i])
lastCanChange = i;
}
if (equal)
{
if (lastCanChange >= 0)
{
chars[lastCanChange]++;
if (chars[lastCanChange] == 'z' + 1)
chars[lastCanChange] = 'a';
goBack = true;
return true;
}
else
return false;
}
for (var i = 0; i < chars.Length && emptyCount > 0; i++)
{
if (chars[i] != 0)
continue;
var insert = 'a';
if (emptyCount == 1 && s2[i] == insert && !hasDiff)
insert++;
chars[i] = insert;
canChange[i] = true;
if (s2[i] != insert)
hasDiff = true;
emptyCount--;
}
return true;
}
}