力扣 2047. 句子中的有效单词数

本文介绍了一个LeetCode题目解决方案,该题要求从给定的句子中统计符合特定规则的有效单词数量。有效单词需全由字母构成,允许单个连字符连接两个合法单词部分,并且标点符号只能出现在单词末尾。

题目来源:https://leetcode-cn.com/problems/number-of-valid-words-in-a-sentence/

大致题意:
给一个字符串,判断里面有多少个合法单词,单词间由空格隔开

合法单词的定义:

  • 全由字母组成
  • 如果有连字符-,那么只能有一个,且连字符前后必须为合法单词
  • 如果有标点符号,那么一定在单词结尾

思路

既然以空格隔开单词,那么可以将所有单词取出来,然后按照规则一个个判断

具体看代码

public int countValidWords(String sentence) {
        int count = 0;
        String[] words = sentence.split(" ");
        for (String word : words) {
            if (checkValidWord(word)) {
                count++;
            }
        }
        return count;
    }

    public boolean checkValidWord(String word) {
        if (word.length() < 1) {
            return false;
        }
        boolean last = false;   // 上一个字符是否为字母
        boolean  ch1 = false;   // 是否有连字符
        boolean ch2 = false;    // 是否有标点符号
        for (int i = 0; i < word.length(); i++) {
            char ch = word.charAt(i);
            if (ch >= '0' && ch <= '9') {   // 如果是数字,不合法
                return false;
            } else if (Character.isLowerCase(ch)) { // 如果是小写字母,合法,判断下一个字符
                last = true;
            } else if (ch == '-') { // 如果是连字符
                // 如果是连字符时,上一个字符不是字母
                // 或者连字符在单词结尾
                // 或者已经出现过连字符
                // 那么就不合法
                if (!last || i == word.length() - 1 || ch1) {
                    return false;
                }
                // 标记连字符出现过
                ch1 = true;
                // 判断下一个字符是否合法
                char next = word.charAt(i+1);
                // 标记当前字符不为字母
                last = false;
                if (Character.isLowerCase(next)) {
                    continue;
                } else {
                    return false;
                }
            } else {    // 如果出现标点
                return i == word.length() - 1;
            }
        }
        // 如果没有出现不合法的情况,表示当前单词合法
        return true;
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三更鬼

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值