Shifting Letters II
Problem (yeniden ifade)
Küçük harflerden string s. shifts[i]=[start,end,dir] kapsayıcı aralığı ileri (dir=1) veya geri (dir=0) 1 kaydırır. Son string’i döndür.
Sezgi
Difference array ile indekse net kaydırma; her karaktere mod 26 uygula.
Yaklaşımlar
Kaydırma deltalarının difference array'i
DoğrulanmadıFikir. Aralıklar üzerinde +1 veya -1; önek toplam, toplam kaydırmadır; (c-‘a’+shift) mod 26.
Yürüyüş. “abc”, [[0,1,0],[1,2,1],[0,2,1]] → “ace”.
Trade-off. Naif sorgu-başı güncelleme O(nq); diff O(n+q)’ya çöker.
export function shiftingLetters(s: string, shifts: number[][]): string {
const n = s.length;
const diff = Array(n + 1).fill(0);
for (const sh of shifts) {
const d = sh[2] === 1 ? 1 : -1;
diff[sh[0]!] += d;
diff[sh[1]! + 1] -= d;
}
const chars = s.split("");
let cur = 0;
for (let i = 0; i < n; i++) {
cur += diff[i]!;
let k = (chars[i]!.charCodeAt(0) - 97 + cur) % 26;
if (k < 0) k += 26;
chars[i] = String.fromCharCode(97 + k);
}
return chars.join("");
}
export function shiftingLetters(s: string, shifts: number[][]): string {
const n = s.length;
const diff = Array(n + 1).fill(0);
for (const sh of shifts) {
const d = sh[2] === 1 ? 1 : -1;
diff[sh[0]!] += d;
diff[sh[1]! + 1] -= d;
}
const chars = s.split("");
let cur = 0;
for (let i = 0; i < n; i++) {
cur += diff[i]!;
let k = (chars[i]!.charCodeAt(0) - 97 + cur) % 26;
if (k < 0) k += 26;
chars[i] = String.fromCharCode(97 + k);
}
return chars.join("");
}
Şablon bağlantısı
String üzerinde difference array aralık güncellemeleri.
Yansıma
- Her kaydırma aralığa +1 veya −1. Son prefix’i 26’ya göre mod alırsın.
enddahil mi? - Geri kaydırma negatife düşer. Python
%ile C#%bu kalanı aynı mı üretir? - Shifts boşsa dizgi durur. Çok basamaklı örtüşen aralıklar prefix’te toplanır.