สมมติว่าเรามีสองสาย s1 และ s2 ที่มีขนาดเท่ากัน เราต้องตรวจสอบว่าการเรียงสับเปลี่ยนของสตริง s1 สามารถทำลายการเรียงสับเปลี่ยนของสตริง s2 หรือในทางกลับกันได้หรือไม่ สตริง a สามารถทำลายสตริง b ถ้า x[i]>=y[i] (ตามลำดับตัวอักษร) สำหรับ i ทั้งหมดในช่วง 0 ถึง n-1
ดังนั้น ถ้าอินพุตเป็นเหมือน s1 =abc และ s2 =xya เอาต์พุตจะเป็นจริง นี่เป็นเพราะว่า "ayx" เป็นการเรียงสับเปลี่ยนของ s2 ที่สามารถแยกสตริง "abc" ซึ่งเป็นการเรียงสับเปลี่ยนของ s1="abc" ได้
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดการตรวจสอบฟังก์ชัน () ซึ่งจะใช้เวลา s1, s2,
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาด s1 อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
ถ้า s2[i]
-
คืนค่าเท็จ
-
-
-
คืนความจริง
-
จากวิธีหลัก ให้ทำดังนี้ −
-
เรียงลำดับอาร์เรย์ s1
-
จัดเรียงอาร์เรย์ s2
-
f3 :=ตรวจสอบ (s2, s1)
-
f4 :=ตรวจสอบ (s1, s2)
-
คืนค่า จริง f3 เป็นจริง หรือ f4 เป็นจริง มิฉะนั้น เท็จ
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: bool check(string& s1, string& s2){ for (int i = 0; i < s1.size(); i++) { if (s2[i] < s1[i]) return false; } return true; } bool checkIfCanBreak(string s1, string s2) { sort(s1.begin(), s1.end()); sort(s2.begin(), s2.end()); bool f3 = check(s2, s1); bool f4 = check(s1, s2); return f3 || f4; } }; main(){ Solution ob; cout << (ob.checkIfCanBreak("abc", "xya")); }
อินพุต
"abc", "xya"
ผลลัพธ์
1