สมมติว่าเราต้องการสร้างสตริงเป้าหมายด้วยตัวพิมพ์เล็ก
ในตอนแรก เรามีลำดับเป็น n '?' เครื่องหมาย (n คือความยาวของสตริงเป้าหมาย) นอกจากนี้เรายังมีตราประทับอักษรตัวพิมพ์เล็กอีกด้วย
ในแต่ละรอบ เราสามารถวางตราประทับไว้เหนือลำดับ และแทนที่ตัวอักษรทุกตัวใน a ด้วยตัวอักษรที่เกี่ยวข้องกันจากตราประทับนั้น คุณสามารถสร้างได้ถึง 10 * n รอบ ตัวอย่างเช่น ให้พิจารณาลำดับเริ่มต้นคือ "?????" และตราประทับคือ "abc" จากนั้นเราอาจสร้างสตริงเช่น "abc?", "?abc?", "??abc" ในลำดับแรก เลี้ยว
หากลำดับนั้นสามารถประทับตราได้ ให้ส่งคืนอาร์เรย์ของดัชนีด้วยตัวอักษรซ้ายสุดที่ประทับในแต่ละตาแหน่ง หากไม่สามารถทำได้ ให้ส่งคืนอาร์เรย์ว่าง ดังนั้นเมื่อลำดับคือ "ababc" และตราประทับคือ "abc" คำตอบจะเป็นแบบ [0, 2] เพราะเราสร้างได้แบบ "?????" -> "เอบีซี?? -> "abbc".
ดังนั้น หากอินพุตเป็นเหมือน stamp ="abcd", target ="abcdbcd" ผลลัพธ์จะเป็น [3,0]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดอาร์เรย์ ret
-
โอเค :=จริง
-
n :=ขนาดของตราประทับ
-
tsz :=0
-
ขณะที่ตกลงไม่เป็นศูนย์ ให้ทำ -
-
โอเค :=เท็จ
-
x :=0
-
สำหรับการเริ่มต้น sz :=ขนาดของตราประทับ เมื่อ sz> 0, อัปเดต (ลด sz ลง 1) ให้ทำ -
-
สำหรับการเริ่มต้น i :=0 เมื่อฉัน <=ขนาดของตราประทับ ให้อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
newStamp :=สตริง '*' ของความยาว i + สตริงย่อยของตราประทับจากดัชนี ito sz-1 + สตริงของ '*' ที่มีขนาดเท่ากับขนาดของตราประทับ
-
pos :=ดัชนีของ newStamp ในเป้าหมาย
-
ในขณะที่ pos อยู่ในเป้าหมาย ให้ทำ -
-
โอเค :=จริง
-
x :=x + sz
-
ใส่ pos ที่ส่วนท้ายของ ret
-
เติมเป้าหมายจากตำแหน่ง pos ถึง pos + ขนาดของตราประทับด้วย '*'
-
pos :=ดัชนีของ newStamp ในเป้าหมาย
-
-
-
-
tsz :=tsz + x
-
-
ย้อนกลับอาร์เรย์ ret
-
return (ถ้า tsz เท่ากับขนาดของเป้าหมาย ให้ ret มิฉะนั้น อาร์เรย์ว่างหนึ่งอัน)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
} cout << "]"<<endl;
}
class Solution {
public:
vector<int> movesToStamp(string stamp, string target) {
vector<int> ret;
bool ok = true;
int n = stamp.size();
int tsz = 0;
while (ok) {
ok = false;
int x = 0;
for (int sz = stamp.size(); sz > 0; sz--) {
for (int i = 0; i <= stamp.size() - sz; i++) {
string newStamp = string(i, '*') +
stamp.substr(i, sz) + string(stamp.size() - sz - i, '*');
int pos = target.find(newStamp);
while (pos != string::npos) {
ok = true;
x += sz;
ret.push_back(pos);
fill(target.begin() + pos, target.begin() +
pos + stamp.size(), '*');
pos = target.find(newStamp);
}
}
}
tsz += x;
}
reverse(ret.begin(), ret.end());
return tsz == target.size() ? ret : vector<int>();
}
};
main(){
Solution ob;
print_vector(ob.movesToStamp("abcd", "abcdbcd"));
} อินพุต
"abcd", "abcdbcd"
ผลลัพธ์
[3, 0, ]