สมมติว่าเรามีสตริง รหัสผ่าน เราต้องหาการเปลี่ยนแปลงขั้นต่ำที่จำเป็นในการทำให้รหัสผ่านแข็งแกร่ง ดังนั้นรหัสผ่านจึงมีเกณฑ์ดังต่อไปนี้ -
- ต้องมีความยาวอย่างน้อย 6 อักขระและไม่เกิน 20 อักขระ
- ต้องมีอักษรตัวพิมพ์เล็กอย่างน้อยหนึ่งตัว อักษรตัวพิมพ์ใหญ่อย่างน้อยหนึ่งตัว และอักขระตัวเลขอย่างน้อยหนึ่งตัว
- ต้องไม่มีอักขระที่ซ้ำกันสามตัวในแถวเช่น …aaa…, …PPP…, …888….
ดังนั้นหากอินพุตเป็นเหมือน "aa26bbb" เราจึงจำเป็นต้องเปลี่ยนอย่างน้อยหนึ่งรายการ เนื่องจากไม่มีตัวพิมพ์ใหญ่และมีตัว b อยู่ 3 ตัวติดต่อกัน เราจึงสามารถแทนที่ b ด้วยอักษรตัวพิมพ์ใหญ่หนึ่งตัวเพื่อให้แข็งแรง
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- ตั้งค่า missingTypes :=3.
- หากมีตัวพิมพ์เล็กอย่างน้อยหนึ่งตัว ให้ลดประเภทที่ขาดหายไป 1
- หากมีอักษรตัวพิมพ์ใหญ่อย่างน้อยหนึ่งตัว ให้ลดประเภทที่ขาดหายไป 1
- หากมีอย่างน้อยหนึ่งหมายเลข ให้ลดประเภทที่หายไป 1
- เปลี่ยน :=0, หนึ่ง :=0 และ สอง :=0, p :=2
- ในขณะที่ p <ขนาดของ s ทำ
- ถ้า s[p] เหมือนกับ s[p – 1] และนี่ก็เหมือนกับ s[p - 2] ด้วย ดังนั้น
- ความยาว :=2
- ในขณะที่ p <ขนาดของ s และ s[p] =s[p – 1] ทำ
- ยาว :=ยาว + 1
- p :=p + 1
- เปลี่ยน :=เปลี่ยน + ความยาว / 3
- ถ้าหารด้วย 3 ลงตัว ให้เพิ่ม 1 ด้วย 1
- มิฉะนั้น เมื่อความยาวหารด้วย 3 ลงตัว ให้เพิ่มสองด้วย 1
- มิฉะนั้น ให้ p เพิ่มขึ้น 1
- ถ้า s[p] เหมือนกับ s[p – 1] และนี่ก็เหมือนกับ s[p - 2] ด้วย ดังนั้น
- ถ้าขนาดของ s <6 ให้คืนค่าสูงสุดของ missing_type และ 6 – ขนาดของ s
- มิฉะนั้นเมื่อขนาดของ s <20 จากนั้นคืนค่าสูงสุดของ missing_type และเปลี่ยน
- อย่างอื่น
- ลบ :=ขนาด s – 20
- เปลี่ยน :=เปลี่ยน – ขั้นต่ำของการลบและหนึ่ง
- เปลี่ยน :=เปลี่ยน – (ต่ำสุดของ (สูงสุดลบ – หนึ่งและ 0) และสอง * 2)/2
- เปลี่ยน :=เปลี่ยน – (สูงสุดลบ – หนึ่ง – 2 * สองและ 0)/2
- คืนค่าการลบ + สูงสุดของ missing_type และการเปลี่ยนแปลง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution(object): def strongPasswordChecker(self, s): missing_type = 3 if any('a' <= c <= 'z' for c in s): missing_type -= 1 if any('A' <= c <= 'Z' for c in s): missing_type -= 1 if any(c.isdigit() for c in s): missing_type -= 1 change = 0 one = two = 0 p = 2 while p < len(s): if s[p] == s[p-1] == s[p-2]: length = 2 while p < len(s) and s[p] == s[p-1]: length += 1 p += 1 change += length / 3 if length % 3 == 0: one += 1 elif length % 3 == 1: two += 1 else: p += 1 if len(s) < 6: return max(missing_type, 6 - len(s)) elif len(s) <= 20: return max(missing_type, change) else: delete = len(s) - 20 change -= min(delete, one) change -= min(max(delete - one, 0), two * 2) / 2 change -= max(delete - one - 2 * two, 0) / 3 return delete + max(missing_type, change) ob = Solution() print(ob.strongPasswordChecker('aa26bbb'))
อินพุต
“aa26bbb”
ผลลัพธ์
1