สร้างอาร์เรย์ 2 ตัว leftDis และ rightDis leftDis เก็บค่าระยะทางจากซ้าย rightDis เก็บค่าระยะทางจากขวา เมื่อเจอตัวอักษรเป้าหมาย บันทึกตำแหน่ง ในขั้นสุดท้ายหาค่าสูงสุด (Max) ของทั้งสองอาร์เรย์
Time Complexity: O(N)
Space Complexity: O(N)
ตัวอย่างโค้ด
public class Arrays
{
public int[] LongestDistanceToCharacter(string s, char c)
{
int n = s.Length;
int[] leftDis = new int[n];
int[] rightDis = new int[n];
// เริ่มต้นค่า
for (int i = 0; i < n; i++)
{
leftDis[i] = int.MinValue;
rightDis[i] = int.MaxValue;
}
// สแกนจากซ้ายไปขวา
int count = int.MaxValue;
for (int i = 0; i < n; i++)
{
if (s[i] == c)
{
count = 0;
rightDis[i] = count;
}
else if (count != int.MaxValue)
{
count++;
rightDis[i] = count;
}
}
// สแกนจากขวาไปซ้าย
count = int.MaxValue;
for (int i = n - 1; i >= 0; i--)
{
if (s[i] == c)
{
count = 0;
leftDis[i] = count;
}
else if (count != int.MaxValue)
{
count++;
leftDis[i] = count;
}
}
// หาค่าสูงสุด
int[] ans = new int[n];
for (int i = 0; i < n; i++)
{
ans[i] = Math.Max(leftDis[i], rightDis[i]);
}
return ans;
}
}
static void Main(string[] args)
{
Arrays s = new Arrays();
string str = "lovecode";
char c = 'e';
var res = s.LongestDistanceToCharacter(str, c);
foreach (var item in res)
{
Console.WriteLine(item);
}
}ผลลัพธ์
2147483647 2147483647 2147483647 0 3 2 3 0
หมายเหตุ: ผลลัพธ์แสดง int.MaxValue/MinValue เพราะตัวอักษร 'e' ไม่ปรากฏทางด้านซ้ายของ index 0-2 โค้ดต้นฉบับมีข้อบกพร่องในการเริ่มต้นค่าและคำนวณระยะทาง "ไกลที่สุด" ควรปรับ منطقให้เหมาะสม