Letcodeを開きました.


Pick oneボタンを押してランダムに問題を選んだ.
906. Super Palindromes

[left,right]の間では,NとN*Nはいずれもパーズ症候群の人数を計算する問題であるようだ.
right<1 e 18なので、可能なN<1 e 9です.
まず1 e 9個のファリンドロンを作製し,平方数がファリンドロンであることを確認した.
小数位数がnより小さい法林絞りを作る時間的複雑さはO(10^(n/2))である.
このときに生じるファリンドロンの個数も同じであり,nより小さい数のファリンドロンを確認する時間の複雑さはO(n)であるため,時間は十分である.
func superpalindromesInRange(_ left: String, _ right: String) -> Int {
    var p = (1...9).map { "\($0)" }
    var res = 0

    for i in 1..<Int(1e4) {
        let s = "\(i)", r = String(s.reversed())
        for j in (0..<10).map { "\($0)" } + [""] {
            p.append(s + j + r)
        }
    }

    for n in p.map { Int($0)! * Int($0)! } {
        if Int(left)! <= n, Int(right)! >= n {
            var s = "\(n)", r = String(s.reversed())
            res += s == r ? 1 : 0
        }
    }

    return res
}