2047. 句子中的有效單詞數
句子僅由小寫字母(‘a’ 到 ‘z’)、數字(‘0’ 到 ‘9’)、連字符(’-’)、標點符號(’!’、’.’ 和 ‘,’)以及空格(’ ')組成。每個句子可以根據空格分解成 一個或者多個 token ,這些 token 之間由一個或者多個空格 ’ ’ 分隔。
如果一個 token 同時滿足下述條件,則認為這個 token 是一個有效單詞:
僅由小寫字母、連字符和/或標點(不含數字)。
至多一個 連字符 ‘-’ 。如果存在,連字符兩側應當都存在小寫字母(“a-b” 是一個有效單詞,但 “-ab” 和 “ab-” 不是有效單詞)。
至多一個 標點符號。如果存在,標點符號應當位于 token 的 末尾 。
這里給出幾個有效單詞的例子:“a-b.”、“afad”、“ba-c”、“a!” 和 “!” 。
給你一個字符串 sentence ,請你找出并返回 sentence 中 有效單詞的數目 。
示例 1:輸入:sentence = "cat and dog"
輸出:3
解釋:句子中的有效單詞是 "cat"、"and" 和 "dog"示例 2:輸入:sentence = "!this 1-s b8d!"
輸出:0
解釋:句子中沒有有效單詞
"!this" 不是有效單詞,因為它以一個標點開頭
"1-s" 和 "b8d" 也不是有效單詞,因為它們都包含數字示例 3:輸入:sentence = "alice and bob are playing stone-game10"
輸出:5
解釋:句子中的有效單詞是 "alice"、"and"、"bob"、"are" 和 "playing"
"stone-game10" 不是有效單詞,因為它含有數字示例 4:輸入:sentence = "he bought 2 pencils, 3 erasers, and 1 pencil-sharpener."
輸出:6
解釋:句子中的有效單詞是 "he"、"bought"、"pencils,"、"erasers,"、"and" 和 "pencil-sharpener."
提示:
- 1 <= sentence.length <= 1000
- sentence 由小寫英文字母、數字(0-9)、以及字符(’ ‘、’-’、’!’、’.’ 和 ‘,’)組成
- 句子中至少有 1 個 token
解題思路
- 先根據空格,將 sentence分隔為幾個字符串
- 如果出現以下幾種情況,則不是有效單詞
- 出現數字
- 標點符號不在最后一個字符
- 連字符 '-'左右不是都為小寫字母
代碼
class Solution {
public:int countValidWords(string sentence) {char * cstr = new char [sentence.length()+1];strcpy (cstr, sentence.c_str());char * p=strtok(cstr," ");int res=0;while (p!=0){string c=p;int i = 0,cnt=0;for (;i < c.size(); ++i) {if (isdigit(c[i]))break;if (c[i]=='-'){cnt++;if (i==0||i==c.size()-1||!isalpha(c[i-1])||!isalpha(c[i+1]))break;}if ((c[i]=='!'||c[i]=='.'||c[i]==',')&&i!=c.size()-1){break;}}if (i==c.size()&&cnt<2) res++;p = strtok(NULL," ");}return res;}
};