三元语言的所有单词仅包含 3 个字母:a、b 和 c,并且都具有严格指定的长度 N。在一行中不包含两个相同字母子序列的单词被认为是正确的。例如,abcacb 是正确的词,而 ababc 不是正确的词,因为 ab 子序列到那里。
我试图通过完整枚举所有可能的组合和一个寻找重复序列的函数来解决这个问题。然而,事实证明这是一个错误的决定。需要使用分支定界方法以某种方式解决问题。我完全不知道如何通过这种方法解决这个问题。如果有人向我提供示例或解释,我会非常高兴。我已经花了六天时间来解决这个问题,而且很累。
我的错误解决方案:
import Foundation
func findRepetition(_ p: String) -> [String:Int] {
var repDict: [String:Int] = [:]
var p = p
while p.count != 0 {
for i in 0...p.count-1 {
repDict[String(Array(p)[0..<i]), default: 0] += 1
}
p = String(p.dropFirst())
}
return repDict
}
var correctWords = [String]()
var wrongWords = [String]()
func getRepeats(_ p: String) -> Bool {
let p = p
var a = findRepetition(p)
for i in a {
var substring = String(Array(repeating: i.key, count: 2).joined())
if p.contains(substring) {
wrongWords.append(p)
return false
}
}
correctWords.append(p)
return true
}
var counter = 0
func allLexicographicRecur (_ string: [String.Element], _ data: [String], _ last: Int, _ index: Int){
var length = string.count-1
var data = data
for i in 0...length {
data[index] = String(string[i])
if index == last {
if getRepeats(data.joined()) {
counter += 1
}
}else{
allLexicographicRecur(string, data, last, index+1)
}
}
}
func threeLanguage(_ l: Int) {
var alphabet = "abc"
var data = Array(repeating: "", count: l)
allLexicographicRecur(alphabet.sorted(), data, l-1, 0)
print("The specified word length: \(l), the number of correct words: \(counter)\n")
print("Correct words:\n\(correctWords)\n")
print("Wrong words:\n\(wrongWords)")
}
threeLanguage(3)
示例:abca 是正确的词。abab 是错误的 (ab)。aaaa 也是错误的 (a)。abcabc 也不正确 (abc)。