[Swift]-小数点を検索


SWIFTを使用して小数点検索の問題を解決


1.問題の説明


一桁と書かれた紙片が散らばっている.ばらばらの紙切れを貼って、いくつかの小数点を作ることができることを見たいです.
各紙片の数字の文字シリアル番号を指定すると、紙片で作成できるいくつかの数を返すための解法関数を完了します.
せいげんじょうけん
numbersは、長さが1または7未満の文字列です.
numbersは0から9まで数字で構成されています.
「013」とは、0から3の数字の紙切れが散らばっていることを意味します.
I/O例
numbers return
"17" 3
"011" 2
I/O例説明
例1
[1,7]小数[7,17,71]を作成できます.
例2
[0,1,1]は小数点を作成することができる[1101].
11と011は同じ数字と見なされます.

2.私の回答

import Foundation

func solution(_ numbers:String) -> Int {
    var arr: [Int] = []
    var cnt: [Int] = Array(repeating: 0, count: numbers.count)
    var odd: [Int] = []
    func isPrime(_ n: Int) -> Int {
        if n == 1 || n == 0 { return 0 }
        var i = 2 
        while i * i <= n {
            if n % i == 0 {
                return 0
            }
            i += 1
        }
        return 1
    }
    var ret: Int = 0
    for c in numbers {
        arr.append(Int(String(c))!)
    }
    var finalNum: Int = 0
    var lv: Int = 0
    func D(_ n: Int, _ level: Int) {
        if lv == level {
            if odd.contains(finalNum) != true {
                ret = isOdd(finalNum) == 1 ? ret+1 : ret
                odd.append(finalNum)
            }
        } else {
            for i in 0..<numbers.count {
                if cnt[i] != 1 {
                    lv += 1
                    finalNum *= 10
                    cnt[i] = 1
                    finalNum += arr[i]
                    D(i+1, level)
                    finalNum /= 10
                    cnt[i] = 0
                    lv -= 1
                }
            }
        }
    }
    for i in 1...numbers.count {
        D(0, i)
    }
    return ret
}

3.解答説明


これまで解決してきた多くのDFS問題を適用した.
Lvを先に置いて深く探索したので、すべてのカードを使わずに作れるデジタルカードの数を見つけるのは難しくありません.
問題は重複するカードがあることです.
したがって,解決策はPrimeの数字だけを単独でArrayとして作成し,繰り返すと+=1を返さない.
結果は100点!