สมมติว่าเรามีสตริง s สตริงนี้สามารถประกอบด้วยอักขระตัวพิมพ์เล็ก อักขระพิเศษอื่นๆ และตัวเลข เราต้องตรวจสอบว่ามีเพียงตัวอักษรที่อยู่ในสตริงเท่านั้นที่เป็นพาลินโดรมหรือไม่ ข้อจำกัดประการหนึ่งคือ เราไม่อนุญาตให้ใช้พื้นที่เพิ่มเติมเพื่อแก้ปัญหานี้
ดังนั้น หากอินพุตเป็น s ="ra$5ce58car" ผลลัพธ์จะเป็น True เนื่องจากตัวอักษรสร้าง "racecar" ซึ่งก็คือ palindrome
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน first_letter_index() นี่จะใช้เวลา str ซ้าย ขวา
- ดัชนี :=-1
- สำหรับฉันอยู่ในช่วงจากซ้ายไปขวา + 1 ทำ
- ถ้า str[i] เป็นอักษรตัวพิมพ์เล็ก แล้ว
- ดัชนี :=ผม
- ออกมาจากลูป
- ถ้า str[i] เป็นอักษรตัวพิมพ์เล็ก แล้ว
- ดัชนีผลตอบแทน
- กำหนดฟังก์ชัน last_letter_index() นี่จะใช้เวลา str ซ้าย ขวา
- ดัชนี :=-1
- สำหรับฉันในช่วงจากซ้ายไปขวา - 1 ลดลง 1 ทำ
- ถ้า str[i] เป็นอักษรตัวพิมพ์เล็ก แล้ว
- ดัชนี :=ผม
- ออกมาจากลูป
- ดัชนีผลตอบแทน
- จากวิธีหลัก ให้ทำดังนี้:
- ซ้าย :=0, ขวา :=ขนาดของ str - 1
- flag :=จริง
- สำหรับฉันในช่วง 0 ถึงขนาดของ str ทำ
- ซ้าย :=first_letter_index(str, ซ้าย, ขวา)
- ขวา :=last_letter_index(str, right, left)
- ถ้าขวา <0 หรือซ้าย <0 แล้ว
- ออกมาจากลูป
- ถ้า str[left] เหมือนกับ str[right] แล้ว
- ซ้าย :=ซ้าย + 1
- ขวา :=ขวา - 1
- ติดตามตอนต่อไป
- flag :=เท็จ
- ออกมาจากลูป
- ถ้า str[i] เป็นอักษรตัวพิมพ์เล็ก แล้ว
- ธงกลับ
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
โค้ดตัวอย่าง
def first_letter_index(str, left, right): index = -1 for i in range(left, right + 1): if str[i] >= 'a' and str[i] <= 'z' : index = i break return index def last_letter_index(str, left, right): index = -1 for i in range(left, right - 1, -1) : if str[i] >= 'a' and str[i] <= 'z': index = i break return index def solve(str): left = 0 right = len(str) - 1 flag = True for i in range(len(str)) : left = first_letter_index(str, left, right) right = last_letter_index(str, right, left) if right < 0 or left < 0: break if str[left] == str[right]: left += 1 right -= 1 continue flag = False break return flag s = "ra$5ce58car" print(solve(s))
อินพุต
"ra$5ce58car"
ผลลัพธ์
True