当前位置: 面试刷题>> 扩展弹性词 (经典算法题500道)


题目描述补充

题目:扩展弹性词算法实现

在文本处理中,我们常常需要处理一些具有“弹性”的词汇,即这些词汇的长度或形式可以根据上下文有所变化,但保持其基本的含义不变。例如,“很好”这个词,在某些情况下可以简化为“好”,或者扩展为“非常好”、“特别好”等。

任务: 实现一个算法,该算法接受一个基准词(如“好”)和一个包含多个扩展词的数组(如["很好", "非常好", "特别好"]),以及一个待匹配的文本字符串。算法需要找出文本中所有与基准词或其扩展词匹配的部分,并返回这些匹配项的列表。

要求

  1. 忽略大小写差异。
  2. 匹配应尽可能精确,即如果文本中包含“好”,且同时存在“很好”,则优先匹配“很好”。
  3. 如果文本中某个词是扩展词的一部分但不是完整扩展词(如“非常好好”),则不应将其视为匹配项。

示例代码

PHP 示例

function findElasticWords($text, $baseWord, $extensions) {
    $baseWordLower = strtolower($baseWord);
    $extensionsLower = array_map('strtolower', $extensions);
    $matches = [];

    // 将文本按空格分割成单词数组
    $words = explode(' ', $text);

    // 遍历每个单词,检查是否为基准词或其扩展词
    foreach ($words as $word) {
        $wordLower = strtolower($word);
        if ($wordLower === $baseWordLower) {
            // 如果直接匹配基准词,加入匹配列表
            $matches[] = $word;
        } elseif (in_array($wordLower, $extensionsLower)) {
            // 如果匹配到扩展词,加入匹配列表
            $matches[] = $word;
        }
    }

    return $matches;
}

// 示例用法
$text = "今天天气很好,心情非常好,但昨天就一般了。";
$baseWord = "好";
$extensions = ["很好", "非常好", "特别好"];
$result = findElasticWords($text, $baseWord, $extensions);
print_r($result);

Python 示例

def find_elastic_words(text, base_word, extensions):
    base_word_lower = base_word.lower()
    extensions_lower = [ext.lower() for ext in extensions]
    matches = []

    # 分割文本为单词列表
    words = text.split()

    # 遍历每个单词,检查匹配
    for word in words:
        word_lower = word.lower()
        if word_lower == base_word_lower or word_lower in extensions_lower:
            matches.append(word)

    return matches

# 示例用法
text = "Today the weather is very good, mood is excellent, but yesterday was just okay."
base_word = "good"
extensions = ["very good", "excellent", "extremely good"]
result = find_elastic_words(text, base_word, extensions)
print(result)

JavaScript 示例

function findElasticWords(text, baseWord, extensions) {
    const baseWordLower = baseWord.toLowerCase();
    const extensionsLower = extensions.map(ext => ext.toLowerCase());
    let matches = [];

    // 分割文本为单词数组
    const words = text.split(/\s+/);

    // 遍历每个单词,检查匹配
    words.forEach(word => {
        const wordLower = word.toLowerCase();
        if (wordLower === baseWordLower || extensionsLower.includes(wordLower)) {
            matches.push(word);
        }
    });

    return matches;
}

// 示例用法
const text = "Today the weather is very good, mood is excellent, but yesterday was just okay.";
const baseWord = "good";
const extensions = ["very good", "excellent", "extremely good"];
const result = findElasticWords(text, baseWord, extensions);
console.log(result);

注意:以上代码示例简单实现了题目要求的功能,但未完全处理所有边界情况(如标点符号紧接词汇后的情况)。在实际应用中,可能需要对输入文本进行更复杂的预处理。

码小课:在码小课网站上,你可以找到更多关于算法、数据结构、编程技巧等方面的精彩内容,帮助你提升编程能力和解决问题的能力。

推荐面试题