swift2 Swift中是否有类似于Python for else语法的表达式

ibps3vxo  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(143)

我正在解决一个算法问题,我同时使用Python和Swift来解决它。在Python中,我可以使用for else语法轻松解决它。但在Swift中,我正在努力寻找一种类似于Python for else语法的方法。
下面是算法问题,它可能会帮助你理解我在做什么。
给定一个字符串数组words,求length(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
    }
}
qni6mghb

qni6mghb1#

您可以只引入一个标志来记录是否调用了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 = ...
}

(On Swift 3这个方法是renamed to Set.isDisjoint(with:)

s6fujrry

s6fujrry2#

我想分享我的答案。感谢肯尼的帮助。

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
    }
}

相关问题