План курса / Все задачи / Алгоритмы и структуры данных
Неточный поиск
легко
# решено
Даны две строки s и t. Необходимо определить, можно ли получить строку s, удаляя некоторые (возможно, ни одного) символы из строки t, не изменяя порядок оставшихся символов.
Пример 1:
Ввод: s = "abc", t = "a1b2c3"
Вывод: True
Объяснение: Можно удалить цифры из t, чтобы получить t = "abc"
Пример 2:
Ввод: s = "abc", t = "acb"
Вывод: False
Ограничения:
len(s) ≥ 0
len(t) ≥ 0
Строки s и t содержат только ascii символы
public class Solution {
public static bool FuzzyMatch(string s, string t) {
int p1 = 0;
int p2 = 0;
// Пока не достигли конца хотя бы одной из строк
while (p1 < s.Length && p2 < t.Length) {
if (s[p1] == t[p2]) {
// Если символы совпадают — продвигаем указатель по s
p1++;
}
// Всегда двигаем указатель по t
p2++;
}
return p1 == s.Length;
}
}
#include <string>
using namespace std;
bool fuzzyMatch(string& s, string& t) {
int p1 = 0;
int p2 = 0;
// Пока не достигли конца хотя бы одной из строк
while (p1 < s.size() && p2 < t.size()) {
if (s[p1] == t[p2]) {
// Если символы совпадают — продвигаем указатель по s
p1++;
}
// Всегда двигаем указатель по t
p2++;
}
return p1 == s.size();
}
package main
func fuzzyMatch(s string, t string) bool {
p1 := 0
p2 := 0
// Пока не достигли конца хотя бы одной из строк
for p1 < len(s) && p2 < len(t) {
if s[p1] == t[p2] {
// Если символы совпадают — продвигаем указатель по s
p1++
}
// Всегда двигаем указатель по t
p2++
}
return p1 == len(s)
}
import java.util.*;
public class Solution {
public boolean fuzzyMatch(String s, String t) {
int p1 = 0;
int p2 = 0;
// Пока не достигли конца хотя бы одной из строк
while (p1 < s.length() && p2 < t.length()) {
if (s.charAt(p1) == t.charAt(p2)) {
// Если символы совпадают — продвигаем указатель по s
p1++;
}
// Всегда двигаем указатель по t
p2++;
}
return p1 == s.length();
}
}
from typing import *
def fuzzy_match(s: str, t: str) -> bool:
p1, p2 = 0, 0
# Пока не достигли конца хотя бы одной из строк
while p1 < len(s) and p2 < len(t):
if s[p1] == t[p2]:
# Если символы совпадают — продвигаем указатель по s
p1 += 1
# Всегда двигаем указатель по t
p2 += 1
return p1 == len(s)
/**
* @param {string} s
* @param {string} t
* @returns {boolean}
*/
export function fuzzyMatch(s, t) {
let p1 = 0;
let p2 = 0;
// Пока не достигли конца хотя бы одной из строк
while (p1 < s.length && p2 < t.length) {
if (s[p1] === t[p2]) {
// Если символы совпадают — продвигаем указатель по s
p1++;
}
// Всегда двигаем указатель по t
p2++;
}
return p1 === s.length;
}
Оценка сложности
Время: O(n+m), где n — длина s, m — длина t
Память: O(1)
Частая ошибка: думать, что оценка по времени O(m) или O(min(n, m)). Тут есть контрпример: s="ab", t="ccab", в котором наглядно видно, что есть случаи, когда пробегаем по обеим строкам полностью.