力扣2047. 句子中的有效单词数
如果一个单词是有效单词它需要满足"[a-z]-[a-z]"这样的格式,由小写字母组成、至多在中间有一个连字符、至多有一个'.,!'在末尾、单词间用' '分开。这样的格式可以使用正则表达式表示出来,常用的正则匹配规则如下:
import re
def re_solution(sentence: str) -> int:
return sum(bool(re.match("^[a-z]*([a-z]-[a-z])?[a-z]*[.!,]?$", word)) for word in sentence.split() if word)
再来用模拟逻辑的方法实现:首先指定一个标志位flag,记录'-'是否出现过,默认为False,如果连字符出现则置为True;遍历sentence字符串,如果包含数字或者在非末尾处出现'.,!'则表明该单词无效;再来看遇到连字符的情况,如果连字符已经出现过(flag=True)或者连字符出现在开头或末尾处,又或者连字符连接的左/右端不止有小写字母,以上的所有情况均构不成有效单词。
将上述判断的结果用bool值返回,并统计为True即1的个数,就是最终结果有效单词数。
def countValidWords(sentence: str) -> int:
def helper(word) -> bool:
flag = False
n = len(word)
for i, c in enumerate(word):
if c.isdigit() or (c in "!.," and i < n -1):
return False
if c == '-':
if flag or i == 0 or i == n - 1 or not word[i-1].islower() or not word[i+1].islower():
return False
flag = True
return True
return sum(helper(word) for word in sentence.split() if word)
END