สมมติว่าเรามีสตริง S ที่แสดงถึงรายการคำ ที่นี่แต่ละตัวอักษรในคำมี 1 ตัวเลือกขึ้นไป หากมีเพียงตัวเลือกเดียว จดหมายจะแสดงตามที่เป็นอยู่ หากมีมากกว่าหนึ่งตัวเลือก วงเล็บปีกกาจะกำหนดตัวเลือก ตัวอย่างเช่น "{a,b,c}" จะแสดงตัวเลือก ["a", "b", "c"] ตัวอย่างเช่น หากอินพุตเป็น "{a,b,c}d{e,f}" จะแสดงรายการ ["ade", "adf", "bde", "bdf", "cde", "cdf"].
ส่งกลับคำทั้งหมดที่เกิดขึ้นในลักษณะนี้ในลำดับพจนานุกรม
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดอาร์เรย์ที่เรียกว่า ret กำหนดตัวแปรประเภทจำนวนเต็ม n
-
กำหนดวิธีการแก้ปัญหา () สิ่งนี้จะใช้ดัชนี รายการ และเคอร์เซอร์เป็นอินพุต
-
ถ้า index =n ให้ใส่ curr เข้าไปที่ ret แล้ว return
-
สำหรับฉันอยู่ในช่วง 0 ถึงขนาดของรายการ[ดัชนี]
-
แก้การโทร (ดัชนี + 1, รายการ, สกุลเงิน + รายการ[ดัชนี, ผม])
-
-
จากวิธีหลัก ให้ทำดังนี้
-
สร้างรายการขนาด 100 ตั้งค่า n :=0, flag :=false
-
สำหรับฉันอยู่ในช่วง 0 ถึงขนาด s – 1
-
ถ้า s[i] เป็นลูกน้ำ ให้ข้ามไปที่การวนซ้ำถัดไป
-
มิฉะนั้นเมื่อ s[i] กำลังเปิดวงเล็บปีกกา ให้ตั้งค่าสถานะ :=true
-
มิฉะนั้นเมื่อ s[i] กำลังปิดวงเล็บปีกกา ให้ตั้งค่าสถานะ :=false และเพิ่ม n ขึ้น 1
-
ไม่เช่นนั้นให้เพิ่ม list[n] โดย s[i] ตอนนี้หากแฟล็กเป็นเท็จ ให้เพิ่ม n ขึ้น 1
-
-
แก้การโทร(0, รายการ, สตริงว่าง)
-
จัดเรียงอาร์เรย์ ret
-
รีเทิร์น
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector <string> ret;
int n;
vector<string> expand(string s) {
vector <string> list(100);
n = 0;
int flag = false;
for(int i = 0; i < s.size(); i++){
if(s[i] == ','){
continue;
}else if(s[i] == '{'){
flag = true;
}else if(s[i] == '}'){
flag = false;
n++;
}else{
list[n] += s[i];
if(!flag)n++;
}
}
solve(0, list);
sort(ret.begin(), ret.end());
return ret;
}
void solve(int idx, vector <string> list, string curr = ""){
if(idx == n){
ret.push_back(curr);
return;
}
for(int i = 0; i < list[idx].size(); i++){
solve(idx + 1, list, curr + list[idx][i]);
}
}
};
main(){
Solution ob;
print_vector(ob.expand("{a,b}c{d,e}f"));
} อินพุต
"{a,b}c{d,e}f" ผลลัพธ์
[acdf, acef, bcdf, bcef, ]