1. 程式人生 > >[LeetCode] Length of Last Word 求末尾單詞的長度

[LeetCode] Length of Last Word 求末尾單詞的長度

Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the length of last word in the string.

If the last word does not exist, return 0.

Note: A word is defined as a character sequence consists of non-space characters only.

For example, 
Given s = "Hello World"

,
return 5.

這道題難度不是很大。先對輸入字串做預處理,去掉開頭和結尾的空格,然後用一個計數器來累計非空格的字串的長度,遇到空格則將計數器清零。程式碼如下:

解法一:

class Solution {
public:
    int lengthOfLastWord(const char *s) {
        int len = strlen(s);
        int left = 0;
        int right = len - 1;
        int count = 0;
        while (s[left] == ' '
) ++left; while (s[right] == ' ') --right; for (int i = left; i <= right; ++i) { if (s[i] == ' ') count = 0; else ++count; } return count; } };

昨晚睡覺前又想到了一種解法,其實不用上面那麼複雜的,我們關心的主要是非空格的字元,那麼我們實際上在遍歷字串的時候,如果遇到非空格的字元,我們只需要判斷其前面一個位置的字元是否為空格,如果是的話,那麼當前肯定是一個新詞的開始,將計數器重置為1,如果不是的話,說明正在統計一個詞的長度,計數器自增1即可。但是需要注意的是,當i=0的時候,無法訪問前一個字元,所以這種情況要特別判斷一下,歸為計數器自增1那類。參見程式碼如下:

解法二:

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

下面這種方法是第一種解法的優化版本,由於我們只關於最後一個單詞的長度,所以開頭有多少個空格起始我們並不在意,我們從字串末尾開始,先將末尾的空格都去掉,然後開始找非空格的字元的長度即可,參見程式碼如下:

解法三:

class Solution {
public:
    int lengthOfLastWord(string s) {
        int right = s.size() - 1, res = 0;
        while (right >= 0 && s[right] == ' ') --right;
        while (right >= 0 && s[right] != ' ' ) {
            --right; 
            ++res;
        }
        return res;
    }
};

這道題用Java來做可以一行搞定,請參見這個帖子.

參考資料: