3474. Lexicographically Smallest Generated String
This commit is contained in:
@@ -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>
|
||||
@@ -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")}\"");
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user