Есть ли в 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
    }
} 
Другие вопросы по тегам