1. 程式人生 > >[LeetCode] Number of Segments in a String 字串中的分段數量

[LeetCode] Number of Segments in a String 字串中的分段數量

Count the number of segments in a string, where a segment is defined to be a contiguous sequence of non-space characters.

Please note that the string does not contain any non-printable characters.

Example:

Input: "Hello, my name is John"
Output: 5
這道題跟之前那道Reverse Words in a String有些類似,不過比那題要簡單一些,因為不用翻轉單詞,只要統計出單詞的數量即可。那麼我們的做法是遍歷字串,遇到空格直接跳過,如果不是空格,則計數器加1,然後用個while迴圈找到下一個空格的位置,這樣就遍歷完了一個單詞,再重複上面的操作直至結束,就能得到正確結果: 解法一:
class
Solution { public: int countSegments(string s) { int res = 0, n = s.size(); for (int i = 0; i < n; ++i) { if (s[i] == ' ') continue; ++res; while (i < n && s[i] != ' ') ++i; } return res; } };

下面這種方法是統計單詞開頭的第一個字元,因為每個單詞的第一個字元前面一個字元一定是空格,利用這個特性也可以統計單詞的個數:

解法二:

class Solution {
public:
    int countSegments(string s) {
        int res = 0;
        for (int i = 0; i < s.size(); ++i) {
            if (s[i] != ' ' && (i == 0 || s[i - 1] == ' ')) {
                ++res;
            }
        }
        return res;
    }
};

下面這種方法用到了C++的字串流操作,利用getline函式取出每兩個空格符之間的字串,由於多個空格符可能連在一起,所以有可能取出空字串,我們要判斷一下,如果取出的是非空字串我們才累加計數器,參見程式碼如下:

解法三:

class Solution {
public:
    int countSegments(string s) {
        int res = 0;
        istringstream is(s);
        string t = "";
        while (getline(is, t, ' ')) {
            if (t.empty()) continue;
            ++res;
        }
        return res;
    }
};

類似題目:

參考資料: