【发布时间】:2016-03-17 14:14:01
【问题描述】:
如果给我一个像skhfbvqa 这样的字符串,我将如何生成 next 字符串?对于这个例子,它是skhfbvqb,下一个字符串是skhfbvqc,以此类推。给定的字符串(和答案)总是 N 个字符长(在这种情况下,N=8)。
我尝试了什么:
我试图生成可能组合的整个(无限)列表,并获取给定字符串的所需(下一个)字符串,但不出所料,它太慢了,我什至没有得到 的答案N=6.
我使用了列表理解:
allStrings = [ c : s | s <- "" : allStrings, c <- ['a'..'z'] ]
main = do
input <- readFile "k.in"
putStrLn . head . tail . dropWhile (not . (==) input) . map reverse $ allStrings
(请原谅我非常糟糕的 Haskell-ing :) 仍然是菜鸟)
所以我的问题是,我该怎么做?如果有多种方法,非常感谢它们之间的比较。谢谢!
【问题讨论】:
-
扫描
allStrings看起来非常低效——它类似于通过\x -> head . tail $ dropWhile (/= x) [0..]计算后继。它有效,但需要指数时间/空间。相反,我会将字符串表示为向后列表,并对每个字符/数字执行标准的“带进位加法”。正如预期的那样,这将具有线性的最坏情况复杂性。 (此外,它也是摊销常数时间,因为几何和收敛,因此是最优的) -
@chi 是的,
allStrings效率极低。这只是我想到的第一件事。你的建议听起来很有趣。您能否提供一个答案,但提供更多指示/步骤?
标签: string algorithm haskell combinations