题目地址:https://leetcode.com/problems/number-of-segments-in-a-string/#/descriptionopen in new window

题目描述

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

题目大意

字符串中有多少个不包含空字符的子字符串。

解题方法

统计

这个题方法应该自己使用过的,不过是倒着来。回想自己以前在每个单词后面输入一个空格,但是行尾不要空格的时候怎么做的?不就是判断第一个单词的前面不打空格,在之后的所有单词的前面打了一个空格。这个题的思路是不是倒着来?

判断某个单词的开始的字符前面是不是空格,如果是字符串的第一个字符也会把技术加1,这样就能统计出所有用空格分割的字符串段的个数。

public class Solution {
    public int countSegments(String s) {
        int count = 0;
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) != ' ' && (i == 0 || s.charAt(i - 1) == ' ')){
                count++;
            }
        }
        return count;
    }
}

1 2 3 4 5 6 7 8 9 10 11

正则表达式

正则\s表示匹配空格,+表示匹配一次或者任意多次。所以有以下代码。

public int countSegments(String s) {
    String trimmed = s.trim();
    if (trimmed.length() == 0) return 0;
    else return trimmed.split("\\s+").length;
}

1 2 3 4 5

python版本:

class Solution(object):
    def countSegments(self, s):
        """
        :type s: str
        :rtype: int
        """
        s = re.sub("\s+", " ", s)
        s = s.strip()
        if not s: return 0
        return len(s.split(" "))

1 2 3 4 5 6 7 8 9 10

另外,如果\S就是匹配所有的非空字符,所以我们只要知道有多少个匹配就好了。

class Solution(object):
    def countSegments(self, s):
        """
        :type s: str
        :rtype: int
        """
        return len(re.findall("\S+", s))

1 2 3 4 5 6 7

字符串分割

python的split()函数,默认的参数就是按照连续空格进行分割。注意,千万不要写参数为" "

class Solution(object):
    def countSegments(self, s):
        """
        :type s: str
        :rtype: int
        """
        return len(s.split())

1 2 3 4 5 6 7

DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有

本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发