每日刷题-567. 字符串的排列

213 阅读1分钟

567. 字符串的排列

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。

换句话说,s1 的排列之一是 s2 的 子串 。

常规解法

    func checkInclusion(_ s1: String, _ s2: String) -> Bool {
        var dic1: [Character : Int] = [:]
        
        for char in s1{
            dic1.updateValue((dic1[char] ?? 0) + 1, forKey: char)
        }
        
        let str2 = Array(s2)
        var dic2: [Character : Int] = [:]
        
        var start = -1
        
        for (index,char) in str2.enumerated(){
            if index >= s1.count{
                start += 1
                let startChar = str2[start]
                if dic2[startChar] == 1{
                    dic2.removeValue(forKey: startChar)
                }else{
                    dic2.updateValue((dic2[startChar] ?? 0)-1, forKey: startChar)
                }
            }
            dic2.updateValue((dic2[char] ?? 0) + 1, forKey: char)
            if dic1 == dic2{
                return true
            }
        }
        return false
    }

大神解法:

func checkInclusion(_ s1: String, _ s2: String) -> Bool {

        var charInfo = [Int](repeating: 0, count: 26)

    var s1Count = 0

    for char in s1 {

        if let asciiValue = char.asciiValue {

            charInfo[Int(asciiValue - 97)] += 1

        }

        s1Count += 1

    }

    var s2Array = [Character]()

    for char in s2 {

        s2Array.append(char)

    }

    if s1Count > s2Array.count {

        return false

    }

    for i in 0..<s1Count {

        if let asciiValue = s2Array[i].asciiValue {

            charInfo[Int(asciiValue - 97)] -= 1

        }

    }

    func checkRusult() -> Bool {

        for value in charInfo {

            if value != 0 {

                return false

            }

        }

        return true

    }

\


    if checkRusult() {

        return true

    }

    for i in s1Count..<s2Array.count {

        let right = Int(s2Array[i].asciiValue ?? 0) - 97

        let left = Int(s2Array[i - s1Count].asciiValue ?? 0) - 97

        charInfo[left] += 1

        charInfo[right] -= 1

        if checkRusult() {

            return true

        }

    }

    return false

    }