string - 在 Haskell 中生成下一个字典字符串

标签 string algorithm haskell combinations

如果给我一个像skhfbvqa 这样的字符串,我将如何生成下一个 字符串?对于此示例,它将是 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 :) 仍然是菜鸟)

所以我的问题是,我该怎么做?如果有多种方法,非常感谢它们之间的比较。谢谢!

最佳答案

这里有一个带base转换的版本(这样你可以随意加减):

encode x base = encode' x [] where
  encode' x' z | x' == 0 = z
               | otherwise = encode' (div x' base) ((mod x' base):z)

decode num base =
  fst $ foldr (\a (b,i) -> (b + a * base^i,i + 1)) (0,0) num

输出:

*Main> map (\x -> toEnum (x + 97)::Char) 
       $ encode (decode (map (\x -> fromEnum x - 97) "skhfbvqa") 26 + 1) 26

"skhfbvqb"

关于string - 在 Haskell 中生成下一个字典字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34227379/

相关文章:

haskell - 解析命令行参数

Java正则表达式检查是否不以特定字符串开头但包含多个字符串

string - 如何在go模板中移动 slice ?

java - 当使用\n 从字符串中读取 double 值时,扫描仪会出现 InputMismatchException — Java

java - 为什么在 if 语句中初始化字符串似乎与在 switch 语句中不同?

algorithm - 间隔树、段树、芬威克树是否相同?

python - 在 Python 中将一长串洗牌次数甚至更长

algorithm - Dijkstra 算法在寻找最短路径方面比 AN* 算法有何优势?

arrays - Haskell 中的数组用类型(而不是数据)定义

haskell - 两个延续如何相互抵消?