朱莉娅:如何找到给定字符串中最长的单词?

时间:2018-04-11 13:06:51

标签: function julia

我是朱莉娅的新人,我从网上接受了这个挑战:

如何找到给定字符串中最长的单词?

我想构建一个允许获取最长字符串的函数,即使在使用标点符号的情况下也是如此。

我正在尝试使用以下代码:

function LongestWord(sen::String)
sentence =maximum(length(split(sen, "")))
word= [(x, length(x)) for x in split(sen, " ")]
return((word))
end

LongestWord("Hello, how are you? nested, punctuation?")

但我无法找到解决方案。

3 个答案:

答案 0 :(得分:4)

您也可以使用正则表达式。只需要@ Bogumil的答案稍作改动:

julia> function LongestWord2(sen::AbstractString)
           words = matchall(r"\w+", sen)
           words[findmax(length.(words))[2]]
       end
LongestWord2 (generic function with 1 method)

julia> LongestWord2("Hello, how are you? nested, punctuation?")
"punctuation"

通过这种方式,您可以摆脱标点符号并恢复原始单词。

要巩固评论,请进一步解释:

matchall()采用正则表达式,在这种情况下r"\w+"匹配像子字符串这样的字,所以字母,数字和小写字母会返回与正则表达式匹配的字符串数组。

length.()正在使用length函数和.的组合,它在数组的所有元素之间广播操作。所以我们计算每个数组元素(字)的长度。

Findmax()返回长度为2的元组,其中2参数为我们提供了最大元素的索引。我使用它来对words数组进行子集化并返回最长的单词。

答案 1 :(得分:3)

我知道您希望保留标点符号,并希望仅在空格(" ")上进行拆分。如果是这种情况,那么您可以使用findmax。请注意,我更改了length(x)x的顺序。通过这种方式,您将找到最长的单词,在使用字符串比较时,您将找到 last 的单词。此外,我将AbstractString放在函数的签名中,因为它将适用于任何字符串:

julia> function LongestWord(sen::AbstractString)
           word = [(length(x), x) for x in split(sen, " ")]
           findmax(word)[1][2]
       end
LongestWord (generic function with 1 method)

julia> LongestWord("Hello, how are you? nested, punctuation?")
"punctuation?"

这是最简单的解决方案,但不是最快的(您可以通过搜索连续出现的空格而不使用word函数创建findnext向量来遍历原始字符串)。

其他方法(甚至更短):

julia> function LongestWord3(sen::AbstractString)
           word = split(sen, " ")
           word[indmax(length.(word))]
       end
LongestWord3 (generic function with 1 method)

julia> LongestWord3("Hello, how are you? nested, punctuation?")
"punctuation?"

答案 2 :(得分:0)

我的版本明确定义了哪些符号是允许的(在本例中为字母,数字和空格):

ALLOWED_SYMBOLS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 \t\n"

function get_longest_word(text::String)::String
    letters = Vector{Char}()
    for symbol in text
        if uppercase(symbol) in ALLOWED_SYMBOLS
            push!(letters, symbol)
        end
    end
    words = split(join(letters))
    return words[indmax(length.(words))]
end

@time get_longest_word("Hello, how are you? nested, punctuation?")

"punctuation"

我怀疑它是世界上效率最高的代码,但是它引起了“反恐怖主义”的反对​​。在大约0.1秒内从一本45,000字的字典中出来。当然,它不会告诉我是否有超过一个字的最大长度!那是另一天的问题...