题目描述

主管期望你来实现英文输入法单词联想功能。
需求如下:

  • 依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词,按字典序输出联想到的单词序列,
  • 如果联想不到,请输出用户输入的单词前缀。

注意:

  1. 英文单词联想时,区分大小写
  2. 缩略形式如”don’t”,判定为两个单词,”don”和”t”
  3. 输出的单词序列,不能有重复单词,且只能是英文单词,不能有标点符号

输入描述

输入为两行。

首行输入一段由英文单词word和标点符号组成的语句str;

接下来一行为一个英文单词前缀pre。

  • 0 < word.length() <= 20
  • 0 < str.length <= 10000
  • 0 < pre <= 20

输出描述

输出符合要求的单词序列或单词前缀,存在多个时,单词之间以单个空格分割

示例:

输入输出
I love you
He
He
说明从用户已输入英文语句”I love you”中提炼出“I”、
“love”、“you”三个单词,接下来用户输入“He”,
从已输入信息中无法联想到任何符合要求的单词,
因此输出用户输入的单词前缀。

Python算法源码

import re

sentence = input()
prefix = input()

sentence = re.sub(r'[^\w\s]', ' ', sentence)  # 将标点符号替换为空格
word_set = set(sentence.split())  # 存储单词的集合,自动去重且按照字典序排序
ans = ''
for word in sorted(word_set):  # 遍历单词集合
    if word.startswith(prefix):  # 如果单词以前缀开头
        ans += word + ' '  # 将单词加入答案字符串

if ans:  # 如果答案字符串不为空
    print(ans)  # 输出单词序列
else:
    print(prefix)  # 否则输出前缀

C语言算法源码

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
    char sentence[1000];
    char prefix[100];
  
    // 读取输入的句子和前缀
    fgets(sentence, sizeof(sentence), stdin);
    fgets(prefix, sizeof(prefix), stdin);

    // 去除标点符号,将其替换为空格
    for (int i = 0; i < strlen(sentence); i++) {
        if (!isalnum(sentence[i]) && !isspace(sentence[i])) {
            sentence[i] = ' ';
        }
    }

    // 存储单词的集合,自动去重且按照字典序排序
    char wordSet[100][100];
    int count = 0;
    char *ptr = strtok(sentence, " ");
    while (ptr != NULL) {
        strcpy(wordSet[count], ptr);
        count++;
        ptr = strtok(NULL, " ");
    }

    // 检查前缀并输出结果
    int flag = 0;
    for (int i = 0; i < count; i++) {
        if (strncmp(wordSet[i], prefix, strlen(prefix)) == 0) {
            printf("%s ", wordSet[i]);
            flag = 1;
        }
    }
    if (!flag) {
        printf("%s", prefix);
    }

    return 0;
}

Java算法源码

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取输入的句子和前缀
        String sentence = scanner.nextLine();
        String prefix = scanner.nextLine();

        // 去除标点符号,将其替换为空格
        sentence = sentence.replaceAll("[^\\w\\s]", " ");

        // 存储单词的集合,自动去重且按照字典序排序
        Set<String> wordSet = new HashSet<>(Arrays.asList(sentence.split(" ")));

        // 检查前缀并输出结果
        StringBuilder ans = new StringBuilder();
        for (String word : wordSet) {
            if (word.startsWith(prefix.trim())) {
                ans.append(word).append(" ");
            }
        }
        if (ans.length() > 0) {
            System.out.println(ans.toString().trim());
        } else {
            System.out.println(prefix.trim());
        }

        scanner.close();
    }
}
最后修改:2024 年 04 月 03 日
如果觉得我的文章对你有用,请随意赞赏