需要在Swift中找到连续的序列,例如“ 6789”或“ abcd”

时间:2018-12-04 13:59:49

标签: swift algorithm search

我需要帮助来查找连续的序列,例如以升序排列的3个以上字符。我已经实现了一个解决方案,但这不是通用的。
例如,应找到的示例-“ 1234”,“ abcd”,“ 5678”。
而且不应该找到什么-“ 123”,“ adced”,“ 123abc”,“ 89 :;”
特别是案例“ 89:;” ,符号“:”-在uniCode中为58,“ 9”-为57,这就是为什么我的方法在这种情况下不起作用的原因。 实施应该迅速。

其他说明

现在仅查找英文字母和数字就足够了。

private func findSequence(sequenceLength: Int, in string: String) -> Bool {

    let scalars = string.unicodeScalars
    var unicodeArray: [Int] = scalars.map({ Int($0.value) })

    var currentLength: Int = 1
    var i = 0
    for number in unicodeArray {
        if i+1 >= unicodeArray.count {
            break
        }
        let nextNumber = unicodeArray[i+1]

        if number+1 == nextNumber {
            currentLength += 1
        } else {
            currentLength = 1
        }
        if currentLength >= sequenceLength {
            return true
        }
        i += 1
    }
    return false
}

2 个答案:

答案 0 :(得分:0)

    var  data = [1,2,5,4,56,6,7,9,6,5,4,5,1,2,5,4,56,6,7,9,8,1,1,2,5,4,56,6,7,9,8,1,1,2,5,4,56,6,7,9,8,1,1,2,5,4,56,6,7,9,8,1,1,2,5,4,56,6,7,9,8,11,2,5,4,56,6,7,9,8,1,2,3]
    
    for i in 0...data.count{
        if i+2 < data.count{
            if Int(data[i] + data[i+2]) / 2 == data[i+1] && Int(data[i] + data[i+2]) % data[i+1] == 0 && data[i+1] != 1 && data[i] < data[i+1]{
                print(data[i] ,data[i+1], data[i+2])
            }
        }
    }

答案 1 :(得分:-1)

您可以使用CharacterSet

检查序列
func findSequence(sequenceLength: Int, in string: String) -> Bool {
    // It would be better to extract this out of func
    let digits = CharacterSet.decimalDigits
    let lowercase = CharacterSet(charactersIn: "a"..."z")
    let uppercase = CharacterSet(charactersIn: "A"..."Z")
    let controlSet = digits.union(lowercase).union(uppercase)
    // ---

    let scalars = string.unicodeScalars
    let unicodeArray = scalars.map({ $0 })

    var currentLength: Int = 1
    var i = 0
    for number in unicodeArray where controlSet.contains(number) {
        if i+1 >= unicodeArray.count {
            break
        }
        let nextNumber = unicodeArray[i+1]

        if UnicodeScalar(number.value+1) == nextNumber {
            currentLength += 1
        } else {
            currentLength = 1
        }
        if currentLength >= sequenceLength {
            return true
        }
        i += 1
    }
    return false
}

我确实假设"a" ... "z""A"..."Z"在此处是连续的,以使其在范围内,但最好列出所有想要的符号可能更好。

或使用CharacterSet.alphanumerics,但不仅限于基本的拉丁字母。