力扣打卡:5906. 句子中的有效单词数
解题思路
字符串的题目是真的搞人心态,每次都是
先分组,然后按照要求来做就可以了,没用正则,不过还是要学习正则的匹配的
代码
class Solution {
HashSet<Character> set1 = new HashSet<>();
HashSet<Character> set2 = new HashSet<>();
public int countValidWords(String sentence) {
set1.add('!');set1.add(',');set1.add('.');
for(int i=0; i<10; i++) set2.add((char) ('0'+i));
String[] arr = sentence.split(" ");
int count = 0;
for(int i=0; i<arr.length; i++) {
if(check(arr[i])) count++;
}
return count;
}
public boolean check(String s) {
// 检查每一个单词
s = s.trim();
if("".equals(s)) return false;
int cnt1 = 0; // 统计-字符的个数
int cnt2 = 0; // 统计标点符号的个数
if(s.charAt(0)=='-' || s.charAt(s.length()-1)=='-') return false; // 如果第一个或者是最后一个是-
if(set1.contains(s.charAt(0)) && s.length()!=1) return false; // 如果第一个是标点符号,而且长度不是1,那么不算有效
for(int i=0; i<s.length(); i++) { //开始遍历字符串
char c = s.charAt(i);
if(c=='-') {
cnt1++; if(cnt1>1) return false;
char a = s.charAt(i-1);
char b = s.charAt(i+1);
if( !('a'<=a && a<='z' && 'a'<=b && b<='z')) return false; // 检查-两边的字符是不是小写字符
}
if(set1.contains(c)) {
cnt2++; if(cnt2>1) return false; // 检查标点符号的作用
if(i!=s.length()-1) return false; // 如果标点符号不是末尾
}
if(set2.contains(c)) return false;
}
return true;
}
}