leetcode每日一题系列-字符串中的单词数-「原生函数」-「双指针」

219 阅读2分钟

leetcode-434-字符串中的单词数

[博客链接]

菜🐔的学习之路

掘金首页

[题目链接]

题目链接

[github地址]

github地址

[题目描述]

统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。

请注意,你可以假定字符串里不包括任何不可打印的字符。

示例:

输入: "Hello, my name is John"
输出: 5
解释: 这里的单词是指连续的不是空格的字符,所以 "Hello," 算作 1 个单词。

思路一:java原生函数

  • 通过java原生函数做字符串分割
  • 分割正则位 +,表示至少一个空格
  • 将所有空字符串排除可以是O(n)级别的操作也可以是O(1)级别的操作
  • 只判断第一个字符串是否为空即可
  • 最后返回不为空的字符串数量
public int countSegments(String s) {
            String[] arr = s.split(" +");
            int res = 0;
            for (String str:arr
                 ) {
                if (!"".equals(str)){
                    res++;
                }
            }
            return res;
        }
  • 时间复杂度O(n),n为字符串长度
  • 时间复杂度O(n)

思路二:双指针

  • 定义两个指针
    • l指针负责记录头部
    • r指针记录尾部,并标记l指针的下一次遍历开始位置
  • 当l遍历到第一个非空字符开始寻找单词结尾,用r来进行标记
  • 为了方便运算,我们将输入字符做扩展处理,在字符结尾加入空格
  • 方便边界结算
public int countSegments(String s) {
    StringBuilder sb = new StringBuilder(s);
    sb.append(" ");
    int l = 0, res = 0;
    while (l < sb.length()) {
        while (l < sb.length() && sb.charAt(l) == ' ') {
            l++;
        }
        int r = l + 1;
        while (r < sb.length()) {
            if (sb.charAt(r) == ' ') {
                l = r;
                res++;
                break;
            }
            r++;
        }

    }
    return res;
}
  • 时间复杂度O(n),n为字符串长度
  • 时间复杂度O(n)