2개의 다른 배열 leftDis 및 rightDis를 만듭니다. leftDis는 왼쪽에서 이동할 때 값을 저장합니다. rightDis는 오른쪽에서 이동할 때 가장 짧은 값을 저장합니다. 문자가 만날 때마다 문자의 위치를 배열에 추가하십시오. 마지막 단계에서 두 배열의 최대값을 계산합니다.
시간 복잡성 - 오(n)
공간 복잡성 - 오(n)
예시
public class Arrays{ public int[] LongestDistanceToCharacter(string s, char c){ int stringLength = s.Length; int[] leftDis = new int[s.Length]; int[] rightDis = new int[s.Length]; leftDis = Enumerable.Range(0, s.Length).Select(n => int.MinValue).ToArray(); rightDis = Enumerable.Range(0, s.Length).Select(n => int.MaxValue).ToArray(); int count = int.MaxValue; for (int i = 0; i < rightDis.Length; 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 = leftDis.Length - 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[stringLength]; for (int i = 0; i < stringLength - 1; i++){ ans[i] = Math.Max(leftDis[i], rightDis[i]); } return ans; } } static void Main(string[] args){ Arrays s = new Arrays(); string ss = "lovecode"; char c = 'e'; var res = s.LongestDistanceToCharacter(ss, c); foreach (var item in res){ Console.WriteLine(item); } }
출력
[2147483647,2147483647,2147483647,0,3,2,3,0]