我是朱莉娅的新人,我从网上接受了这个挑战:
如何找到给定字符串中最长的单词?
我想构建一个允许获取最长字符串的函数,即使在使用标点符号的情况下也是如此。
我正在尝试使用以下代码:
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?")
但我无法找到解决方案。
答案 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字的字典中出来。当然,它不会告诉我是否有超过一个字的最大长度!那是另一天的问题...