สมมติว่าเรามีพจนานุกรมสตริงและสตริง เราต้องหาสตริงที่ยาวที่สุดในพจนานุกรมที่สามารถเกิดขึ้นได้โดยการลบอักขระบางตัวของสตริงที่กำหนด หากมีผลลัพธ์ที่เป็นไปได้มากกว่าหนึ่งรายการ ให้ส่งคืนคำที่ยาวที่สุดด้วยลำดับพจนานุกรมที่เล็กที่สุด หากไม่มีผลลัพธ์ ให้ส่งคืนสตริงว่าง ดังนั้นหากอินพุตเป็น "abpcplea" และ d =["ale", "apple", "monkey", "plea"] ผลลัพธ์จะเป็น "apple"
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดวิธีการที่เรียกว่า isSubsequence() นี่จะใช้เวลา s1 และ s2
- j :=0
- สำหรับ i ในช่วง 0 ถึงขนาด s1
- ถ้า s2[j] =s1[i] ให้เพิ่ม j ขึ้น 1
- ถ้า j =ขนาดของ s2 ให้แตกลูป
- คืนค่า จริง ถ้า j =ขนาดของ s2
- จากวิธีหลัก ให้ทำดังต่อไปนี้ −
- ans :=สตริงว่าง
- สำหรับ i ในช่วง 0 ถึงขนาด d – 1
- x :=d[i]
- ถ้าขนาดของ x> ขนาดของ ans หรือ ขนาดของ x =ขนาดของ ans และ x
- ถ้า isSubsequence(s, x) เป็นจริง ให้ตอบ :=x
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: bool isSubsequence(string s1, string s2){ int j =0; for(int i = 0; i < s1.size(); i++){ if(s2[j] == s1[i]){ j++; if(j == s2.size()) break; } } return j == s2.size(); } string findLongestWord(string s, vector<string>& d) { string ans = ""; for(int i = 0; i < d.size(); i++){ string x = d[i]; if(x.size() > ans.size() || (x.size() == ans.size() && (x < ans))){ if(isSubsequence(s, x)) ans = x; } } return ans; } }; main(){ vector<string> v = {"ale","apple","monkey","plea"}; Solution ob; cout << (ob.findLongestWord("abpcplea", v)); }
อินพุต
"abpcplea" ["ale","apple","monkey","plea"]
ผลลัพธ์
apple