Когда я пытаюсь решить проблему в Leetcode 1208 , я замечаю, что код Swift намного медленнее, чем Objective-C.
Вот мой код в Swift:
func equalSubstring(_ s: String, _ t: String, _ maxCost: Int) -> Int {
let list = zip(s,t).map { $0 }
var costList = [Int].init(repeating: 0, count: list.count)
for item in list.enumerated() {
costList[item.offset] = abs(Int(item.element.0.asciiValue!) - Int(item.element.1.asciiValue!))
}
var maxLen = 0
for i in 0..<costList.count {
var len = 0, cost = maxCost
for j in i..<costList.count {
cost -= costList[j]
if cost >= 0 {
len += 1
} else {
break
}
}
if len > maxLen {
maxLen = len
}
}
return maxLen
}
Требуется 496,363 секунды, чтобы справиться с вводом длины 100000 с maxCost 93020. Контрольный пример
Но если я использую тот же подход в Objective-C, это займет всего 19 с:
- (int)equalSubstring:(NSString *)s t:(NSString *)t maxCost:(int)maxCost {
NSMutableArray *costList = [[NSMutableArray alloc] init];
for (int i=0; i<s.length; i++) {
[costList addObject:@(abs([s characterAtIndex:i] - [t characterAtIndex:i]))];
}
int maxLen = 0;
for (int i=0; i<costList.count; i++) {
int cost = maxCost, len = 0;
for (int j=i; j<costList.count; j++) {
cost -= [costList[j] intValue];
if (cost >= 0) {
len += 1;
} else {
break;
}
}
if (len > maxLen) {
maxLen = len;
}
}
return maxLen;
}
в Javascript будет еще быстрее:
var equalSubstring = function(s, t, maxCost) {
var maxLength = 0;
for (var i=0; i<s.length; i++) {
var cost = maxCost, len = 0;
for (var j=i; j<s.length; j++) {
let c = Math.abs(s.charCodeAt(j) - t.charCodeAt(j));
cost -= c;
if (cost >= 0) {
len += 1;
} else {
break;
}
}
if (len > maxLength) {
maxLength = len;
}
}
return maxLength;
};
В чем может быть причина того, что Swift так медлителен? Проблема будет в самом языке?