暴力比對:第一次出現位置
Brute-Force First Match・dsa-15-01
- APCS 中級
- 暴力子字串搜尋與取代
- 資料結構與演算法・String Algorithms
時間限制 1 秒・記憶體 64 MB
送出程式要先用 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,若你的讀入方式會漏掉空行,要注意處理。
送出程式要先用 Discord 帳號登入 Aki-Judge,並加入註解 Annotated 的 Discord 伺服器(免費)。看題目不用登入。
卡住了可以到 Discord 的 #程式問題 發問,小墨助教會先給提示,不會直接給答案。