133.Longest Words-最长单词(容易题)

最长单词

  1. 题目

    给一个词典,找出其中所有最长的单词。

  2. 样例

    在词典
    这里写图片描述
    中, 最长的单词集合为 [“internationalization”]

    在词典
    这里写图片描述
    中,最长的单词集合为 [“like”, “love”, “hate”]

  3. 挑战

    遍历两次的办法很容易想到,如果只遍历一次你有没有什么好办法?

  4. 题解

    先将第一个单词加入列表,然后进行遍历,遇到长度相等的单词则加入列表,遇到长度更大的将列表清空后加入该单词。

class Solution {
    /**
     * @param dictionary: an array of strings
     * @return: an arraylist of strings
     */
    ArrayList<String> longestWords(String[] dictionary) {
        int n = dictionary.length;
        ArrayList<String> result = new ArrayList<>();
        result.add(dictionary[0]);
        for (int i=1;i<n;i++)
        {
            if (dictionary[i].length() == result.get(0).length())
            {
                result.add(dictionary[i]);
            }
            else if (dictionary[i].length() > result.get(0).length())
            {
                result.clear();
                result.add(dictionary[i]);
            }
        }

        return result;
    }
};

Last Update 2016.9.6

### 问分析 要解决编号为 1111 的问“查找最长单词”,需从一行句子中提取出最长单词。输入的句子由字母、空格、逗号和句号组成,单词由这些分隔符隔开。任务是识别出第一个出现的最长单词,并输出其内容和度。 根据目要求,单词由连续的字母构成,而空格、逗号和句号是单词之间的分隔符。因此,在处理输入字符串时,需要正确地将这些分隔符识别出来,并将字符串分割成单词列表。 在处理过程中,需要注意以下几点: - **单词的提取**:使用正则表达式或字符串处理函数来提取由字母组成的单词- **单词度的比较**:遍历所有单词,比较它们的度,记录最长单词- **优先选择**:如果多个单词度相同,选择第一个出现的单词。 ### C++ 实现方案 C++ 提供了丰富的字符串处理功能,可以使用 `std::string` 和 `std::vector` 来处理输入字符串和单词列表。此外,`std::regex` 可用于提取单词。 以下是一个完整的 C++ 程序实现: ```cpp #include <iostream> #include <sstream> #include <vector> #include <regex> #include <algorithm> int main() { std::string text; std::getline(std::cin, text); // 读取一行输入 std::regex word_regex(R"(\b[a-zA-Z]+\b)"); // 匹配由字母组成的单词 std::sregex_iterator words_begin = std::sregex_iterator(text.begin(), text.end(), word_regex); std::sregex_iterator words_end = std::sregex_iterator(); std::vector<std::string> words; for (std::sregex_iterator i = words_begin; i != words_end; ++i) { words.push_back((*i).str()); } if (words.empty()) { std::cout << "没有找到任何单词。" << std::endl; return 0; } std::string longest_word = *std::max_element(words.begin(), words.end(), [](const std::string& a, const std::string& b) { return a.length() < b.length(); }); std::cout << "最长单词是: " << longest_word << ", 度为: " << longest_word.length() << std::endl; return 0; } ``` ### 代码说明 - **输入处理**:使用 `std::getline` 读取一行输入文本。 - **单词提取**:通过正则表达式 `R"(\b[a-zA-Z]+\b)"` 匹配所有由字母组成的单词- **最长单词查找**:使用 `std::max_element` 遍历单词列表,并根据字符串度比较,找到最长单词- **输出结果**:输出最长单词及其度。 ### 处理特殊情况 - 如果输入中没有单词,程序会输出提示信息“没有找到任何单词”。 - 对于多个度相同的单词,`std::max_element` 会返回第一个最长单词[^3]。 ### 性能与扩展 - 该程序的时间复杂度主要为 O(n),其中 n 是输入文本的度。 - 如果需要支持中文等非空格分隔的语言,可以引入分词工具(如 `jieba`)进行处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值