Dipecahkan: temukan posisi substring dalam string

Pembaharuan Terakhir: 09/11/2023

Baiklah, mari kita mulai tentang cara menemukan substring dalam string di Haskell.

Haskell adalah bahasa pemrograman yang berfungsi murni yang dikenal dengan abstraksi tingkat tinggi dan sintaksis ekspresifnya. Salah satu tugas umum ketika menangani string adalah menemukan substring dalam string yang lebih besar – yaitu, mengidentifikasi posisi yang tepat di mana rangkaian karakter tertentu muncul.

Untuk tujuan ini, kita dapat memanfaatkan dua fungsi Haskell bawaan: `isPrefixOf` dan `tails`. `isPrefixOf` memeriksa apakah suatu daftar merupakan awalan dari daftar lain, dan `tails` menghasilkan semua bagian akhir dari sebuah daftar. Kami juga akan menggunakan fungsi `elemIndex` dari `Data.List` untuk mendapatkan indeks kemunculan pertama elemen tertentu.

Berikut adalah solusi sederhana untuk masalah ini:

import Data.List

findSubstring :: String -> String -> Maybe Int
findSubstring substr str = 
    elemIndex True $ map (isPrefixOf substr) (tails str)

Cara kerja Kode

Fungsi `findSubstring` mengambil dua argumen, `substr` dan `str`, yang masing-masing mewakili substring yang kita cari dan string yang kita cari.

  • Pertama, `tails str` menghasilkan semua kemungkinan akhiran `str`. Misalnya, jika diberi string “hello”, `tails` akan menghasilkan [“hello”, “ello”, “llo”, “lo”, “o”, “”].
  • Selanjutnya, `map (isPrefixOf substr)` menerapkan fungsi `isPrefixOf substr` ke setiap elemen daftar yang dihasilkan oleh `tails str`. Ini menghasilkan daftar nilai Boolean, masing-masing menunjukkan apakah `substr` merupakan awalan dari elemen terkait dalam daftar asli.
  • Terakhir, `elemIndex True` menelusuri daftar Boolean ini untuk kemunculan pertama `True`, yang sesuai dengan posisi `substr` di `str`, dan mengembalikannya dalam tipe data `Mungkin`.

Fungsi Utama dan Perpustakaan

Data.Daftar adalah perpustakaan Haskell yang dikemas dengan fungsi berguna untuk memanipulasi daftar. Antara lain, ia mengekspor fungsi `isPrefixOf`, `tails`, dan `elemIndex` yang kami gunakan dalam solusi kami.

Fungsi `isPrefixOf` sangat penting untuk solusi kami. Dengan memeriksa apakah substring target kita adalah awalan dari setiap subdaftar, pada dasarnya ia memeriksa setiap kemungkinan posisi awal substring kita dalam string asli.

Ekstrapolasi dan Varian

Pendekatan sederhana ini dapat diekstrapolasi untuk melakukan tugas yang lebih kompleks, seperti menemukan semua kemunculan substring, mengganti substring dengan string lain, atau memecah string menjadi beberapa bagian berdasarkan pembatas.

Sebagai contoh, untuk mengganti semua kemunculan substring, Anda dapat menggunakan `intercalate` dari Data.List untuk menggabungkan potongan yang diperoleh dari pemutusan string asli pada posisi substring target.

Terlepas dari kesederhanaan dan ekspresi yang melekat, pendekatan Haskell terhadap pemrosesan string menunjukkan kekuatan pemrograman fungsional dalam menangani tugas-tugas umum dengan cara yang bersih, mudah dibaca, dan ringkas.

Pos terkait: