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.