http://acm.timus.ru/problem.aspx?space=1&num=1769 原題鏈接
大致意思:
在輸入的字符串 "10123456789" 中有若干的子串(substring)可表示某個正整數, 找出一個最小的\不在這些子串中的正整數. 這裏輸出爲 11. (10, 1-9 均在)
思路: ( 語境: Ruby)
原來我是想總的長度有限制, 這個字符串能夠表達的子串大小. 所以 我開始了brute force. (蠻力破解, 往往也是我先上手直觀解決的方式. 而且往往也會以失敗告終 - - ) .
生成1..99999 的字符串數組 , 然後逐一用 .include? 方法 如果找到第一個不在的 則輸出.
效果, 當然 如果是個短串,這麼做是沒有問題, 可惜的是這裏規定了1.0second. 因此這種方法只能放在了註釋中.
新的思路:
原來是以目標出發, 換種角度, 以輸入出發. 從輸入串中不斷的取下一段 看它有哪些可能(構造法) 然後在生成的一個大整數數組中標記已經構造出的整數.
如 :
marker = Array.new ( 1000001, 0 )
當一個串"123456" 出現, 那麼它就會將
1.2.3.4.5.6 \ 12.23.34.45.56. .... 123456 這些子串對應的數組的值發生變化. 然後再對下段串進行分析 .
注意的問題, 這些小子串最大長度是取5? 取6? 這個要去分析原串的最大長度.
迭代優化:
12345678 . 如果以5爲長度
第一段 12345
第二段 23456
第三段 34567
第四段 45678
爲避免重複記錄 應該考慮後段與前段的重複部分 如何避免?
huh. that's all.