Mô tả bài toán
Cho hai chuỗi s, t chỉ chứa chữ thường. Một phép toán: thay đổi một ký tự bất kỳ thành chữ thường khác. Cần thỏa mãn một trong ba điều kiện:
- Mọi ký tự trong
s< nhỏ hơn mọi ký tự trongt. - Mọi ký tự trong
t< nhỏ hơn mọi ký tự trongs. - Cả
svàtchỉ chứa một ký tự duy nhất.
Tìm số phép toán tối thiểu.
Ví dụ
s = "sts", t = "uss" -> đầu ra 2 (đổi t thành "uuu" hoặc đổi cả hai thành "sss").
Giải thuật
- Đếm tần suất ký tự trong
svàt. - Duyệt qua 'a' đến 'z', tính:
unique: số thay đổi để cả hai chỉ chứa ký tực.less_s: số thay đổi để mọi ký tựs<t(ngưỡng tạic).less_t: số thay đổi để mọi ký tựt<s.
- Trả về min của ba giá trị trên.
Triển khai Python
from collections import Counter
import string
def solve(s, t):
counter_s = Counter(s)
counter_t = Counter(t)
less_s, less_t, unique = float('inf'), float('inf'), float('inf')
accu_s, accu_t = 0, 0
for c in string.ascii_lowercase:
unique = min(unique, len(s) + len(t) - counter_s[c] - counter_t[c])
if c > 'a':
less_s = min(less_s, len(s) - accu_s + accu_t)
less_t = min(less_t, len(t) - accu_t + accu_s)
accu_s += counter_s[c]
accu_t += counter_t[c]
return min(less_s, less_t, unique)
s = "sts"
t = "uss"
print(solve(s, t))
Đầu vào
"sts", "uss"
Đầu ra
2