前言
- 大家好,我是新人简书博主:「 个人主页」主要分享程序员生活、编程技术、* * 以及每日的LeetCode刷题记录,欢迎大家关注我,一起学习交流,谢谢!
- 正在坚持每日更新LeetCode每日一题,发布的题解有些会参考其他大佬的思路(参考资料的链接会放在最下面),欢迎大家关注我 ~ ~ ~
- 同时也在进行其他专项类型题目的刷题与题解活动,相关资料也会同步到「GitHub」上面 ~
- 今天是坚持写题解的31天(haha,从21年圣诞节开始的),大家一起加油
- 每日一题:LeetCode:2047.句子中的有效单词数
- 时间:2022-01-27
- 力扣难度:Easy
- 个人难度:Easy
- 数据结构:字符串
- 算法:模拟、数学
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 是字符串的长度
- 时间复杂度:
- 空间复杂度:
最后
如果本文有所帮助的话,欢迎大家可以给个三连「点赞」&「收藏」&「关注」 ~ ~ ~
也希望大家有空的时候光临我的其他平台,上面会更新Java面经、八股文、刷题记录等等,欢迎大家光临交流,谢谢!