[問題] Stack design problem

看板C_and_CPP (C/C++)作者 (科技始終沒有人性)時間12年前 (2014/01/22 11:36), 編輯推噓9(909)
留言18則, 6人參與, 最新討論串1/1
問題(Question): 假設任意輸入字串"abc[[ab]111" 需要將無法匹配的中括號位置印出來 以上面輸入為例就是印出3 (因為4-7匹配) 餵入的資料(Input): string pointer int CompareFunc(char *str); 在一個memory不受限的情形下 這可以用stack去歸類成基本問題 如果設計要求上增加限制: 1.輸入字串長度可能是一個極大值 2.空間複雜度必須為O(1),即指不能因為字串長度變動增加計憶體使用量 從這個條件看來,我自己覺得stack只能被排除 但我想不到其它algorithm可以解這個問題 不知道有沒有高手可以解惑? (pseudo code/純設計概念可) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.250.34.42

01/22 12:05, , 1F
你要求的空間複雜度 是否包含輸入的字串
01/22 12:05, 1F

01/22 12:07, , 2F
還是輸入字串不算 extra的記憶體用量O(1)就好
01/22 12:07, 2F
嗯,只記該func內使用的 話說輸入字串算的話,在呼叫func時應該早就GG了 (笑 簡單說,就是希望字串長度100時用量x,長度1000時也是用量x這樣 可無視時間複雜度...(本來就不合理)

01/22 12:50, , 3F
這幾個字串 "a[[[b]c" , "a[[b]]c" , "a[b]]]c" 各應輸出多少?
01/22 12:50, 3F

01/22 12:54, , 4F
字串長度變動不增加計憶體使用量, input 看來就是該字串,
01/22 12:54, 4F

01/22 12:56, , 5F
若包含輸入的字串, 那...
01/22 12:56, 5F

01/22 13:06, , 6F
若上面三個字串的輸出分別為 1,-1,4 或 1,-1,5 的話,
01/22 13:06, 6F

01/22 13:08, , 7F
那甚至輸入可為 pipe fd/stream 而不需 O(n) 的輸入字串空間;
01/22 13:08, 7F

01/22 13:13, , 8F
但若要求第一個字串的輸出為 2, 那就需要輸入字串本身占空間.
01/22 13:13, 8F
以下從0開始跳 "a[[[b]c" >>> 理論上要輸出 1 2 (3&5是一對) "a[[b]]c" >>> 理論上不輸出 (1&5一對, 2&4一對) "a[b]]]c" >>> 理論上輸出 4 5 (1&3一對) 我的煩惱點就在於,如果不記錄要做匹配檢查的工作也很麻煩 乾脆直接拿*str開刀算了XD 找到匹配的就清掉 最後再scan一次再沒配到的印出來,畢竟題目是沒說不能動*str... 這問題是別人問我的,沒有標準答案 ※ 編輯: silufear 來自: 1.160.236.15 (01/22 22:40)

01/22 22:58, , 9F
如果字串可以隨意讀取的話, 那就寫兩層迴圈暴力找就好了
01/22 22:58, 9F

01/23 03:33, , 10F
http://ideone.com/G7TdLQ 暴力法解 有錯麻煩指正
01/23 03:33, 10F
原來簡易的鄰近比對就可以判斷是否匹配字元 受教了,感謝指教 ※ 編輯: silufear 來自: 111.250.15.213 (01/23 10:28)

01/23 10:40, , 11F
就像 vi 的 % 一樣
01/23 10:40, 11F

01/23 13:12, , 12F
原以為是 CompareFunc() 的 return code 丟出不匹配的位置,
01/23 13:12, 12F

01/23 13:13, , 13F
結果原來是所有不對應的都 print out 出來.
01/23 13:13, 13F

01/23 13:45, , 14F
如果不考慮印出位置值一定要由小到大, 那麼從頭至尾先找出
01/23 13:45, 14F

01/23 13:46, , 15F
不匹配的 ], 再從尾至頭找出不匹配的 [ , 可降時間複雜度.
01/23 13:46, 15F

01/27 13:38, , 16F
這很讓我想到turing machine呢
01/27 13:38, 16F

01/27 13:40, , 17F
把非中括號的字元都標為忽略 之後再找兩個不忽略相鄰
01/27 13:40, 17F

01/27 13:42, , 18F
並且不相同的字串(也就是連續的[])標為忽略 最後剩下即解
01/27 13:42, 18F
文章代碼(AID): #1ItpofzM (C_and_CPP)
文章代碼(AID): #1ItpofzM (C_and_CPP)