LeetCode【算法】宝石与石头
给定字符串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 |