LeetCode【算法】宝石与石头
$[timeformat('2021-10-08T11:13:12+08:00')]

给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。

J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。

示例 1:

输入: J = "aA", S = "aAAbbbb" 输出: 3 示例 2: 输入: J = "z", S = "ZZ" 输出: 0

注意:

S 和 J 最多含有50个字母。 J 中的字符不重复。

常规操作

func numJewelsInStones(_ J: String, _ S: String) -> Int {
   var gemNum:Int = 0

   for jew in J.characters {
       for stone in S.characters {
           if stone == jew {
               gemNum = gemNum + 1
           }
       }
   }
   return gemNum
}
执行时间 内存消耗
28ms 19.1M

优化后

 func numJewelsInStones(_ J: String, _ S: String) -> Int {
    var gemNum:Int = 0
    for jew in J {
        for stone in S {
            if stone == jew {
                gemNum = gemNum + 1
            }
        }
    }
    return gemNum

}
执行时间 内存消耗
16ms 19.5MB

考虑尽量减少中间变量

func numJewelsInStones(_ J: String, _ S: String) -> Int {

    var newS = S
    for jew in J.characters {
       newS = newS.replacingOccurrences(of: "\(jew)", with: "")
    }

    return S.count - newS.count
}
执行时间 内存消耗
52ms 20.5M

减少字符串操作

func numJewelsInStones(_ J: String, _ S: String) -> Int {
    var jewNum:Int = 0;
    for stone in S {
        if J.contains(stone) {
            jewNum = jewNum + 1;
        }
    }
    return jewNum;
}
执行时间 内存消耗
40ms 18.9MB

考虑少用字符串比较的Function

func numJewelsInStones(_ J: String, _ S: String) -> Int {
    var jewNum:Int = 0;
    var jSet = Set<Character>();
    for jew in J {
        jSet.insert(jew)
    }
    for stone in S {
        if jSet.contains(stone) {
            jewNum = jewNum + 1;
        }
    }
    return jewNum;
}
执行时间 内存消耗
16ms 19.3M