// 題目

暴力比對:第一次出現位置

Brute-Force First Match・dsa-15-01

  • APCS 中級
  • 暴力子字串搜尋與取代
  • 資料結構與演算法・String Algorithms

時間限制 1 秒・記憶體 64 MB

到 Aki-Judge 送出

送出程式要先用 Discord 帳號登入 Aki-Judge,並加入註解 Annotated 的 Discord 伺服器(免費)。看題目不用登入。

題目敘述

小宇在整理一份班級共筆,想知道某個關鍵字第一次出現在哪裡。給你一段文字 text 與一個關鍵字 pattern,請從文字最左邊開始,逐一嘗試每個起點、逐字元比對,找出關鍵字第一次完整出現的位置。

輸出該位置的從 0 開始的索引。若關鍵字沒有出現,輸出 −1;若關鍵字是空字串,輸出 0。

輸入格式

  • 第 1 行:字串 text。
  • 第 2 行:字串 pattern。
  • 兩個字串都只含小寫英文字母 a–z。

輸出格式

輸出一個整數:第一次出現的起始索引,或 −1。

限制

  • 大型測試中 1 ≤ |text| ≤ 5000
  • 大型測試中 1 ≤ |pattern| ≤ 20
  • 較小的手造測資中 |text| ≤ 200

範例

範例 1

輸入

ababcababa
aba

輸出

0

範例 2

輸入

hello
world

輸出

-1

範例 3

輸入

mississippi
iss

輸出

1

範例 4

輸入

aaaa
aa

輸出

0

範例 5

輸入

a
a

輸出

0

說明

  • 範例 1:從索引 0 開始的三個字元就是 aba,第一個起點就成功。
  • 範例 2:hello 的任何位置都湊不出 world,所以輸出 −1。
  • 範例 3:iss 在索引 1 與 4 各出現一次,只需要回報較左邊的 1。
  • 範例 4:aa 在索引 0 與 1 都能對上(兩者重疊),仍然只輸出最左邊的 0。
  • 範例 5:文字與關鍵字都只有一個字元且相同,在索引 0 對上。
  • 找到第一個符合的位置就可以停止,不必繼續掃描。
  • 比對某個起點時,只要遇到不同的字元就放棄這個起點,不用比完整個關鍵字。
  • 最壞情況需要 O(|text| · |pattern|) 次比較,這也是關鍵字長度只到 20 的原因。
  • 關鍵字為空字串時答案是 0,若你的讀入方式會漏掉空行,要注意處理。

到 Aki-Judge 送出

送出程式要先用 Discord 帳號登入 Aki-Judge,並加入註解 Annotated 的 Discord 伺服器(免費)。看題目不用登入。

卡住了可以到 Discord 的 #程式問題 發問,小墨助教會先給提示,不會直接給答案。