てくてくテック

【LeetCode】434. Number of Segments in a String 22日目

leetcode

先日できなかった...!

悔しいです..!!!!

仕方なしですね...

21日目は飛ばして22からです!

ではやっていきます!

434. Number of Segments in a String

今回の問題はこちらです!

問題としては、英語の文章に置いて、空白で区切られた単語がいくつあるのか?を調べる問題になっています。

例をお借りすると...

Input: s = "Hello, my name is John"
Output: 5

上記の、"Hello, my name is John"の場合..

"Hello,", "my", "name", "is", "John"で、5ですね。

そのため、5が正解になります。

アルゴリズム

今回もpythonのメソッドパワーをお借りしていきます...!(二週目以降はもっとちゃんとした感じで考えます...)

では、みていきます!

まずは単純に、文章中の出現回数を抽出します。

今回はpythonでCollectionsというものがあるらしいので、それを利用しました。

c = collections.Counter(s.split(' '))

上記にて、splitで空白区切りで値と出現回数を保持します。

# printするとこんな感じです。
Counter({'Hello,': 1, 'my': 1, 'name': 1, 'is': 1, 'John': 1})

この中から、出現回数だけ和を出せばいいはずなので...

print(c.values())
print(sum(c.values()))

dict_values([1, 1, 1, 1, 1])
5

上記のように、valuesで値だけ抽出後、それの和を求めれば良さそうです。

ただし...

上記だけではうまくいかず、スペースに何も挟まれていない場合もカウントされてしまうようです。

## "Hello, my name is John     "の場合
Counter({'': 5, 'Hello,': 1, 'my': 1, 'name': 1, 'is': 1, 'John': 1})

例外としてはこの'' の数値だけ取り除くだけでうまくいきそうなため、値を指定して''のものだけpopして取り除き、その値をのぞいた総和を求めることで対応しました。

popの際、何かしら値がない場合、default値を指定しなければエラーになってしまうため、今回は何も使いませんが, 見つからない場合のデフォルトの返り値をつけています。

c.pop('', "Not Found")

そこだけしっかり修正すれば、acceptになりました。

提出したコード

import collections
class Solution:
    def countSegments(self, s: str) -> int:
        c = collections.Counter(s.split(' '))
        c.pop('', "Not Found")
        return sum(c.values())

## 結果
Runtime: 40 ms, faster than 12.42% of Python3 online submissions for Number of Segments in a String.
Memory Usage: 14.4 MB, less than 10.41% of Python3 online submissions for Number of Segments in a String.
モバイルバージョンを終了