[問題] 一個演算法相關的問題
抱歉 @@ 因為沒有演算法的專版,
之前在此版常受到大家幫忙
所以還是來最常逛的 C/C++ 版來發問了
===================================
想請問一個演算法相關的問題
假設我有一段 text, 長度是 n
另外還有一段 pattern, 長度是 m
其中 n > m
我知道說, 在 text 的哪些位置是 character 'X', 共 A 個
我也知道, 在 pattern 的哪些位置是 character 'X', 共 B 個
我想求, pattern 從 text 的第一個位置滑到最後一個位置時
其中哪些位置是 pattern 中的 'X' 有對到 text 中的 'X' 的
只要任意一個 X 有對到就可以, 不用全部對到
也就是
find all 1<= i <= n,
such that for pairs (p[1],t[i]) , (p[2],t[i+1]) , ... , (p[m],t[i+m-1])
至少有一個 pair 是 (X,X)
給個例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
如果 T = X - - - X - X X - - X X - - -
P = X - - X
( - 表示任意非 X 字元)
我們求出來的解是 1, 2, 4, 5, 7, 8, 9, 11, 12 這幾個位置
因為當 P shift 到這幾個位置時, 都會有 X 對上 X 的情況
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
T = X - - - X - X X - - X X - - -
1 P = X - - X
2 X - - X
4 X - - X
5 X - - X
7 X - - X
8 X - - X
9 X - - X
11 X - - X
12 X - - X
當然最暴力的做法的時間複雜度會是 O(A*B)
可是因為我們知道, 這些位置最多就是 n 個
A*B 的作法會重複算到一些位置
請問這個問題有辦法在 O(n + m) 裡面解出來嗎??
或是拜託有經驗的大大可以提供相關的關鍵字讓我去搜尋~
想 google 或爬文都不知道該如何下手 Orz
謝謝^^
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.78.217
→
06/08 12:47, , 1F
06/08 12:47, 1F
→
06/08 12:51, , 2F
06/08 12:51, 2F
→
06/08 12:52, , 3F
06/08 12:52, 3F
推
06/08 12:52, , 4F
06/08 12:52, 4F
※ walker2009:轉錄至看板 Prob_Solve 06/08 12:53
→
06/08 12:53, , 5F
06/08 12:53, 5F
→
06/08 12:57, , 6F
06/08 12:57, 6F
→
06/08 13:01, , 7F
06/08 13:01, 7F
※ 編輯: walker2009 來自: 140.114.78.217 (06/08 13:01)
推
06/08 13:08, , 8F
06/08 13:08, 8F
→
06/08 13:13, , 9F
06/08 13:13, 9F
→
06/08 13:14, , 10F
06/08 13:14, 10F
→
06/08 13:14, , 11F
06/08 13:14, 11F
→
06/08 13:15, , 12F
06/08 13:15, 12F
→
06/08 13:15, , 13F
06/08 13:15, 13F
→
06/08 13:22, , 14F
06/08 13:22, 14F
※ 編輯: walker2009 來自: 140.114.78.217 (06/08 13:42)
→
06/08 13:45, , 15F
06/08 13:45, 15F
→
06/08 13:45, , 16F
06/08 13:45, 16F
推
06/08 13:52, , 17F
06/08 13:52, 17F
→
06/08 13:54, , 18F
06/08 13:54, 18F
→
06/08 13:56, , 19F
06/08 13:56, 19F
→
06/08 13:57, , 20F
06/08 13:57, 20F
→
06/08 13:59, , 21F
06/08 13:59, 21F
→
06/08 14:08, , 22F
06/08 14:08, 22F
→
06/08 14:08, , 23F
06/08 14:08, 23F
→
06/08 14:08, , 24F
06/08 14:08, 24F
→
06/08 14:12, , 25F
06/08 14:12, 25F
→
06/08 14:12, , 26F
06/08 14:12, 26F
→
06/08 14:12, , 27F
06/08 14:12, 27F
→
06/08 14:15, , 28F
06/08 14:15, 28F
→
06/08 14:27, , 29F
06/08 14:27, 29F
→
06/08 14:32, , 30F
06/08 14:32, 30F
→
06/08 14:39, , 31F
06/08 14:39, 31F
→
06/08 14:46, , 32F
06/08 14:46, 32F
※ 編輯: walker2009 來自: 140.114.78.217 (06/08 14:46)
推
06/08 14:47, , 33F
06/08 14:47, 33F
→
06/08 14:48, , 34F
06/08 14:48, 34F
→
06/08 14:48, , 35F
06/08 14:48, 35F
※ 編輯: walker2009 來自: 140.114.78.217 (06/08 14:59)
推
06/08 15:13, , 36F
06/08 15:13, 36F
→
06/08 15:36, , 37F
06/08 15:36, 37F
→
06/08 15:43, , 38F
06/08 15:43, 38F
→
06/08 15:45, , 39F
06/08 15:45, 39F
→
06/08 15:45, , 40F
06/08 15:45, 40F
→
06/08 15:45, , 41F
06/08 15:45, 41F
→
06/08 15:46, , 42F
06/08 15:46, 42F
→
06/08 15:46, , 43F
06/08 15:46, 43F
→
06/08 15:46, , 44F
06/08 15:46, 44F
→
06/08 15:48, , 45F
06/08 15:48, 45F
推
06/08 15:52, , 46F
06/08 15:52, 46F
→
06/08 16:23, , 47F
06/08 16:23, 47F
→
06/08 16:33, , 48F
06/08 16:33, 48F
→
06/08 16:34, , 49F
06/08 16:34, 49F
→
06/08 16:41, , 50F
06/08 16:41, 50F
→
06/08 16:41, , 51F
06/08 16:41, 51F
→
06/08 16:41, , 52F
06/08 16:41, 52F
→
06/08 16:42, , 53F
06/08 16:42, 53F
→
06/08 16:43, , 54F
06/08 16:43, 54F
推
06/08 16:46, , 55F
06/08 16:46, 55F
→
06/08 16:47, , 56F
06/08 16:47, 56F
→
06/08 16:47, , 57F
06/08 16:47, 57F
→
06/08 16:50, , 58F
06/08 16:50, 58F
→
06/08 16:50, , 59F
06/08 16:50, 59F
→
06/08 16:52, , 60F
06/08 16:52, 60F
→
06/08 16:59, , 61F
06/08 16:59, 61F
→
06/08 17:06, , 62F
06/08 17:06, 62F
→
06/08 17:08, , 63F
06/08 17:08, 63F
→
06/08 17:08, , 64F
06/08 17:08, 64F
→
06/08 17:16, , 65F
06/08 17:16, 65F
推
06/08 17:51, , 66F
06/08 17:51, 66F
→
06/08 17:56, , 67F
06/08 17:56, 67F
推
06/09 08:41, , 68F
06/09 08:41, 68F
→
06/09 09:55, , 69F
06/09 09:55, 69F
→
06/09 10:55, , 70F
06/09 10:55, 70F
→
06/09 10:56, , 71F
06/09 10:56, 71F
→
06/09 10:59, , 72F
06/09 10:59, 72F
→
06/09 11:00, , 73F
06/09 11:00, 73F
→
06/09 13:17, , 74F
06/09 13:17, 74F
推
06/09 13:26, , 75F
06/09 13:26, 75F
→
06/09 13:28, , 76F
06/09 13:28, 76F
→
06/09 13:28, , 77F
06/09 13:28, 77F
→
06/09 13:28, , 78F
06/09 13:28, 78F
→
06/09 13:35, , 79F
06/09 13:35, 79F
推
06/09 13:47, , 80F
06/09 13:47, 80F
→
06/09 14:17, , 81F
06/09 14:17, 81F
推
06/09 16:09, , 82F
06/09 16:09, 82F
推
06/09 17:04, , 83F
06/09 17:04, 83F
討論串 (同標題文章)