LC2047有效单词的个数:字符串模拟

136 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路

前言

大家好,我是新人掘金博主:「掘金」 正在坚持每日更新LeetCode每日一题,发布的题解有些会参考其他大佬的思路(参考资料的链接会放在最下面),欢迎大家关注我 ~ ~ ~ 同时也在进行其他专项类型题目的刷题与题解活动,相关资料也会同步到「GitHub」上面 ~ 今天是坚持写题解的31天(haha,从21年圣诞节开始的),大家一起加油!


  • 每日一题:LeetCode:2047.句子中的有效单词数
    • 时间:2022-01-27
    • 力扣难度:Easy
    • 个人难度:Easy
    • 数据结构:字符串
    • 算法:模拟、数学

LeetCode每日一题.jpg

2022-01-26:LeetCode:2047.句子中的有效单词数

1. 题目描述

  • 题目:原题链接

    • 句子仅由小写字母('a' 到 'z')、数字('0' 到 '9')、连字符('-')、标点符号('!'、'.' 和 ',')以及空格(' ')组成。
    • 每个句子可以根据空格分解成 一个或者多个 token ,这些 token 之间由一个或者多个空格 ' ' 分隔。
    • 如果一个 token 同时满足下述条件,则认为这个 token 是一个有效单词:
      • 仅由小写字母、连字符和/或标点(不含数字)。
      • 至多一个 连字符 '-' 。如果存在,连字符两侧应当都存在小写字母("a-b" 是一个有效单词,但 "-ab" 和 "ab-" 不是有效单词)。
      • 至多一个 标点符号。如果存在,标点符号应当位于 token 的 末尾 。
    • 这里给出几个有效单词的例子:"a-b."、"afad"、"ba-c"、"a!" 和 "!" 。
    • 给你一个字符串 sentence ,请你找出并返回 sentence 中 有效单词的数目。
    • 1 <= sentence.length <= 1000
    • 句子中至少有 1 个 token
  • 输入输出规范

    • 输入:句子字符串
    • 输出:有效单词个数
  • 输入输出示例

    • 输入:sentence = "cat and dog"
    • 输出:3

2. 方法一:模拟

  • 思路

    • 根据题意直接进行模拟
    • 单词无效对应以下几种情况
      • 单词中包含数字
      • 单词中包含两个以上连字符
      • 连字符在单词头部或者单词末尾
      • 连字符的左/右边字符不是小写字母
      • 单词中的标点符号不在单词的末尾
  • 题解

    public int countValidWords(String sentence) {
        if (sentence == null || sentence.length() == 0) return 0;
        int n = sentence.length();
        int count = 0;
        int left = 0, right = 0;
        while (true) {
            // 删除开头的空格
            while (left < n && sentence.charAt(left) == ' ') left++;
            if (left >= n) break;
            right = left + 1;
            // 找到单词
            while (right < n && sentence.charAt(right) != ' ') right++;
            if (isValid(sentence.substring(left, right))) count++;
            left = right + 1; // 去寻找下一个单词
        }
        return count;
    }
    
    private boolean isValid(String word) {
        int n = word.length();
        int hyphenCount = 0, markCount = 0;
        for (int i = 0; i < n; i++) {
            if (Character.isDigit(word.charAt(i))) return false;
            else if (word.charAt(i) == '-') {
                hyphenCount++;
                if (hyphenCount > 1 || i == 0 || i == n - 1
                    || !Character.isLetter(word.charAt(i - 1))
                    || !Character.isLetter(word.charAt(i + 1))) {
                    return false;
                }
            } else if (word.charAt(i) == '!' || word.charAt(i) == '.' || word.charAt(i) == ',') {
                markCount++;
                if (markCount > 1) return false;
                if (i != n - 1) return false;
            }
        }
        return true;
    }
    
  • 复杂度分析:n 是字符串的长度

    • 时间复杂度:O(n)O(n)
    • 空间复杂度:O(1)O(1)

最后

如果本文有所帮助的话,欢迎大家可以给个三连「点赞」&「收藏」&「关注」 ~ ~ ~ 也希望大家有空的时候光临我的其他平台,上面会更新Java面经、八股文、刷题记录等等,欢迎大家光临交流,谢谢!