Notes & software courses · Free to learn
Aph's Blog
On this page

โจทย์ String

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

นับ ตัด แปลง พลิก และตรวจสอบข้อความ — โจทย์ที่เจอบ่อยทั้งในงานจริงและสัมภาษณ์

โจทย์ String ฝึกใช้ index, slice และเมธอดจัดการข้อความ หลายข้อเป็นโจทย์สัมภาษณ์คลาสสิก ลองทำเองก่อนเปิดเฉลย

ข้อ 1 — นับสระ 🟢

รับข้อความภาษาอังกฤษ แล้วนับว่ามีสระ (a, e, i, o, u) กี่ตัว เช่น "hello" มีสระ 2 ตัว

เฉลย + คำอธิบาย
python
s = input("ข้อความ: ").lower()
vowels = "aeiou"
count = 0
for ch in s:
    if ch in vowels:
        count += 1
print(f"มีสระ {count} ตัว")

แปลงเป็นตัวพิมพ์เล็กก่อน (lower) เพื่อให้ A และ a นับเหมือนกัน แล้ววนทีละตัวอักษร เช็คว่าอยู่ในชุดสระไหมด้วย in — สั้นกว่าการเขียน if เทียบทีละตัว

ข้อ 2 — กลับข้อความ 🟢

รับข้อความแล้วพิมพ์กลับด้าน เช่น "hello" → "olleh" (ลองทั้งแบบใช้ slice และแบบวน loop)

เฉลย + คำอธิบาย
python
s = input("ข้อความ: ")

# แบบสั้นด้วย slice
print(s[::-1])

# แบบวน loop เพื่อเข้าใจหลักการ
result = ""
for ch in s:
    result = ch + result   # เอาตัวใหม่ไว้หน้า
print(result)

s[::-1] คือ slice ที่ก้าว -1 = อ่านจากท้ายมาหน้า เป็นสำนวนกลับลำดับที่สั้นที่สุด ส่วนแบบ loop: ต่อตัวอักษรใหม่ไว้ "หน้า" ผลลัพธ์เดิม ทำให้ลำดับกลับด้าน

ข้อ 3 — พาลินโดรม 🟢

เช็คว่าข้อความเป็นพาลินโดรมไหม (อ่านหน้า-หลังเหมือนกัน) เช่น "level", "radar" เป็น แต่ "hello" ไม่เป็น

เฉลย + คำอธิบาย
python
s = input("ข้อความ: ")
if s == s[::-1]:
    print("เป็นพาลินโดรม")
else:
    print("ไม่เป็น")

พาลินโดรมคือข้อความที่เท่ากับตัวเองเมื่อกลับด้าน จึงเทียบ s == s[::-1] ได้เลย วิธีนี้ใช้ slice ในข้อ 2 มาต่อยอด — สังเกตว่าโจทย์ต่อยอดกันได้

ข้อ 4 — นับจำนวนคำ 🟢

รับประโยค แล้วนับว่ามีกี่คำ เช่น "the quick brown fox" มี 4 คำ (จัดการช่องว่างซ้ำ ๆ ด้วย)

เฉลย + คำอธิบาย
python
s = input("ประโยค: ")
words = s.split()        # ตัดด้วยช่องว่าง (จัดการช่องว่างซ้ำให้เอง)
print(f"มี {len(words)} คำ")

split() แบบไม่ใส่อะไรจะตัดด้วยช่องว่าง และรวมช่องว่างซ้ำ ๆ เป็นตัวเดียวให้อัตโนมัติ (เช่น "a b" ได้ ['a','b']) ปลอดภัยกว่า split(" ") ที่จะได้ค่าว่างปนมา

ข้อ 5 — นับความถี่ตัวอักษร 🟡

รับคำ แล้วแสดงว่าตัวอักษรแต่ละตัวปรากฏกี่ครั้ง เช่น "banana" → b:1, a:3, n:2

คำใบ้

ใช้ dictionary เก็บคู่ ตัวอักษร → จำนวน ใช้ .get(ch, 0) เพื่อเริ่มนับจาก 0 เมื่อยังไม่เคยเห็นตัวนั้น

เฉลย + คำอธิบาย
python
s = input("คำ: ")
count = {}
for ch in s:
    count[ch] = count.get(ch, 0) + 1

for ch, n in count.items():
    print(f"{ch}: {n}")

count.get(ch, 0) คืนค่าปัจจุบันของ ch ถ้ามี ไม่งั้นคืน 0 แล้วบวก 1 — เป็น pattern การนับความถี่ที่ใช้บ่อยมาก จำไว้ใช้ได้ทั้งนับตัวอักษร นับคำ และนับอะไรก็ได้

ข้อ 6 — Anagram 🟡

เช็คว่าสองคำเป็น anagram กันไหม (ใช้ตัวอักษรชุดเดียวกันแค่สลับตำแหน่ง) เช่น "listen" กับ "silent" เป็น anagram กัน

เฉลย + คำอธิบาย
python
a = input("คำที่ 1: ").lower()
b = input("คำที่ 2: ").lower()

# ถ้าเรียงตัวอักษรแล้วเท่ากัน = anagram
if sorted(a) == sorted(b):
    print("เป็น anagram")
else:
    print("ไม่เป็น")

เคล็ดลับ: anagram ใช้ตัวอักษรชุดเดียวกัน ดังนั้นถ้า sort ตัวอักษรของทั้งสองคำแล้วได้ผลเท่ากัน ก็เป็น anagram กัน sorted("listen") และ sorted("silent") ต่างได้ ['e','i','l','n','s','t'] เหมือนกัน วิธีนี้สั้นและเข้าใจง่าย

ข้อ 7 — ตัวอักษรไม่ซ้ำตัวแรก 🔴

หาตัวอักษรตัวแรกในข้อความที่ไม่ซ้ำกับตัวอื่นเลย เช่น "leetcode" → 'l', "aabbc" → 'c' ถ้าไม่มีให้คืน None

เฉลย + คำอธิบาย
python
def first_unique(s):
    count = {}
    for ch in s:                 # นับความถี่ก่อน
        count[ch] = count.get(ch, 0) + 1
    for ch in s:                 # วนตามลำดับเดิม หาตัวแรกที่นับได้ 1
        if count[ch] == 1:
            return ch
    return None

print(first_unique("leetcode"))  # l
print(first_unique("aabb"))      # None

วน 2 รอบ: รอบแรกนับความถี่ทุกตัว (dict) รอบสองวนตามลำดับเดิมหาตัวแรกที่ความถี่เป็น 1 ทำไมต้องสองรอบ? เพราะรอบแรกต้องรู้ความถี่ครบก่อน ถึงจะตัดสินได้ในรอบสอง — complexity O(n) เร็วกว่าการเทียบทุกคู่ O(n²)

ลองต่อยอด

ข้อ 5–7 ใช้ dictionary นับความถี่เหมือนกัน นี่คือเครื่องมือสำคัญที่จะใช้ต่อในหัวข้อ Dictionary & Set ลองทำโจทย์เพิ่ม: นับคำที่ยาวที่สุดในประโยค, ลบช่องว่างซ้ำ