План курса / Все задачи / Алгоритмы и структуры данных
Ближайшая буква
средне
# решено
Дана строка s и символ ch, который точно встречается в строке. Верните массив result, где result[i] — расстояние от символа s[i] до ближайшего символа ch.
Пример 1:
Ввод: s = "aaxaa", ch = "x"
Вывод: [2,1,0,1,2]
Пример 2:
Ввод: s = "bcabbcde", ch = "b"
Вывод: [0,1,1,0,0,1,2,3]
Ограничения:
len(s) >= 1
s содержит только ascii символы
ch - это ascii символ
public class Solution
{
public static List<int> FindClosest(string s, char ch)
{
int n = s.Length;
int[] distances = new int[n];
// Проход слева направо: ищем ближайший символ ch слева
int lastChPos = -n;
for (int i = 0; i < n; i++)
{
if (s[i] == ch)
{
lastChPos = i;
}
distances[i] = i - lastChPos;
}
// Проход справа налево: ищем ближайший символ ch справа и берём минимум
lastChPos = 2 * n;
for (int i = n - 1; i >= 0; i--)
{
if (s[i] == ch)
{
lastChPos = i;
}
distances[i] = Math.Min(distances[i], lastChPos - i);
}
return new List<int>(distances);
}
}
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector<int> findClosest(string &s, char ch) {
int n = s.size();
vector<int> distances(n);
// проход слева направо: ищем ближайший символ ch слева
int lastChPos = -n;
for (int i = 0; i < n; i++) {
if (s[i] == ch) {
lastChPos = i;
}
distances[i] = i - lastChPos;
}
// проход справа налево: ищем ближайший символ ch справа и берём минимум
lastChPos = 2 * n;
for (int i = n - 1; i >= 0; i--) {
if (s[i] == ch) {
lastChPos = i;
}
distances[i] = min(distances[i], lastChPos - i);
}
return distances;
}
package main
func findClosest(s string, ch rune) []int {
runes := []rune(s)
n := len(runes)
distances := make([]int, n)
// проход слева направо: ищем ближайший символ ch слева
lastChPos := -n
for i := 0; i < n; i++ {
if runes[i] == ch {
lastChPos = i
}
distances[i] = i - lastChPos
}
// проход справа налево: ищем ближайший символ ch справа и берём минимум
lastChPos = 2 * n
for i := n - 1; i >= 0; i-- {
if runes[i] == ch {
lastChPos = i
}
distances[i] = min(distances[i], lastChPos-i)
}
return distances
}
import java.util.*;
public class Solution {
public List<Integer> findClosest(String s, char ch) {
int n = s.length();
int[] distances = new int[n];
// проход слева направо: ищем ближайший символ ch слева
int lastChPos = -n;
for (int i = 0; i < n; i++) {
if (s.charAt(i) == ch) {
lastChPos = i;
}
distances[i] = i - lastChPos;
}
// проход справа налево: ищем ближайший символ ch справа и берём минимум
lastChPos = 2 * n;
for (int i = n - 1; i >= 0; i--) {
if (s.charAt(i) == ch) {
lastChPos = i;
}
distances[i] = Math.min(distances[i], lastChPos - i);
}
return Arrays.stream(distances).boxed().toList();
}
}
from typing import *
def find_closest(s: str, ch: str) -> List[int]:
n = len(s)
distances: List[int] = [0] * n
# проход слева направо: ищем ближайший символ ch слева
last_ch_pos = -n
for i in range(n):
if s[i] == ch:
last_ch_pos = i
distances[i] = i - last_ch_pos
# проход справа налево: ищем ближайший символ ch справа и берём минимум
last_ch_pos = 2 * n
for i in range(n - 1, -1, -1):
if s[i] == ch:
last_ch_pos = i
distances[i] = min(distances[i], last_ch_pos - i)
return distances
/**
* @param {string} s
* @param {string} ch
* @returns {number[]}
*/
export function findClosest(s, ch) {
const n = s.length;
const distances = new Array(n);
// проход слева направо: ищем ближайший символ ch слева
let lastChPos = -n;
for (let i = 0; i < n; i++) {
if (s[i] === ch) {
lastChPos = i;
}
distances[i] = i - lastChPos;
}
// проход справа налево: ищем ближайший символ ch справа и берём минимум
lastChPos = 2 * n;
for (let i = n - 1; i >= 0; i--) {
if (s[i] === ch) {
lastChPos = i;
}
distances[i] = Math.min(distances[i], lastChPos - i);
}
return distances;
}