Есть ли в Swift выражение, похожее на Python для остального синтаксиса?
Я решаю проблему с алгоритмом и использую и Python, и Swift для ее решения. В python я могу использовать синтаксис for else, чтобы решить это легко. Но в Swift я изо всех сил пытаюсь найти способ, который похож на python для остального синтаксиса.
Вот проблема алгоритма, она может помочь вам понять, что я делаю.
По заданному строковому массиву слов найдите максимальное значение длины (word[i]) * length(word[j]), где два слова не имеют общих букв. Вы можете предположить, что каждое слово будет содержать только строчные буквы. Если таких двух слов не существует, вернуть 0.
Пример 1: данный ["abcw", "baz", "foo", "bar", "xtfn", "abcdef"]
Возврат 16
Два слова могут быть "abcw", "xtfn".
Пример 2: данные ["a", "ab", "abc", "d", "cd", "bcd", "abcd"]
Возврат 4
Два слова могут быть "ab", "cd".
Пример 3: Дано ["a", "aa", "aaa", "aaaa"]
Возврат 0
Нет такой пары слов.
Вот мой код из двух наборов.
Код Python работает.
class Solution(object):
def maxProduct(self, words):
maximum = 0
while words:
currentWord = set(words[0])
current_length = len(words[0])
words = words[1:]
for ele in words:
for char in currentWord:
if char in ele:
break
else:
maximum = max(maximum,current_length*len(ele))
return maximum
Код swift не работает хорошо.
class Solution
{
func maxProduct(words: [String]) -> Int
{
var input = words
let length = input.count
var maximum = 0
while input.count != 0
{
let cur_word = Set(input[0].characters)
let cur_length = input[0].characters.count
input = Array(input[1..<length])
for item in input
{
for char in item.characters
{
if cur_word.contains(char)
{
break
}
}
// how add a control follow here? if cur_word does not share same character with item, then does the below max statement
//else
//{
maximum = max(maximum,cur_length*(item.characters.count))
//}
}
}
return maximum
}
}
2 ответа
Вы можете просто ввести флаг для записи, если break
называется или нет. Заявление
for a in b:
if c(a):
break
else:
d()
такой же как
found = False
for a in b:
if c(a):
found = True
break
if not found:
d()
Но учтите, что вам не нужно for char in item.characters
цикл вообще, так как вы могли бы просто использовать Set.isDisjointWith(_:)
метод.
if cur_word.isDisjointWith(item.characters) {
maximum = ...
}
(На Swift 3 этот метод переименован вSet.isDisjoint(with:)
)
Я хотел бы поделиться своим ответом. Ценю помощь Кеннитма.
class Solution
{
func maxProduct(words: [String]) -> Int
{
var input = words
var length = input.count
var maximum = 0
while input.count != 0
{
let cur_word = Set(input[0].characters)
let cur_length = input[0].characters.count
input = Array(input[1..<length])
length -= 1
for item in input
{
if cur_word.isDisjointWith(item.characters)
{
maximum = max(maximum, cur_length*(item.characters.count))
}
}
}
return maximum
}
}