Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

หาจำนวนคำขั้นต่ำเพื่อสร้างสตริงเป้าหมาย (Set Cover Problem)

แนวคิด

โจทย์แบบ Set Cover: หาจำนวนคำน้อยที่สุดจากลิสต์ ที่รวมตัวอักษร (unique characters) ครอบคลุมสตริงเป้าหมายทั้งหมด ใช้ itertools.combinations ลองทุกชุดย่อย

ตัวอย่างโค้ด

from itertools import combinations

my_list = ["python", "is", "fun", "to", "learn"]
print("ลิสต์คำ:", my_list)

my_target_str = "onis"
print("สตริงเป้าหมาย:", my_target_str)

target_set = set(my_target_str)
my_result = -1
found = False

for r in range(len(my_list) + 1):
    for combo in combinations(my_list, r):
        # รวมตัวอักษรใน combo
        combined = set(''.join(combo))
        if target_set.issubset(combined):
            my_result = r
            found = True
            break
    if found:
        break

print("จำนวนคำขั้นต่ำ:", my_result)

ผลลัพธ์

ลิสต์คำ: ['python', 'is', 'fun', 'to', 'learn']
สตริงเป้าหมาย: onis
จำนวนคำขั้นต่ำ: 2

คำอธิบาย

  • target_set = {'o', 'n', 'i', 's'}
  • ลองชุด 1 คำ: ไม่มีคำไหนครอบคลุมทั้ง 4 ตัวอักษร
  • ลองชุด 2 คำ: "python" + "is" -> {'p','y','t','h','o','n','i','s'} ครอบคลุม -> ได้ 2

หมายเหตุประสิทธิภาพ

อัลกอริทึมนี้เป็น O(2ⁿ) ใช้ได้กับลิสต์เล็ก (n ≤ 20) สำหรับข้อมูลใหญ่ ใช้ Greedy Approximation หรือ Integer Programming