Leetcode 966:元音拼写检查器

本文介绍了一种拼写检查器的实现方法,该检查器能够处理大小写和元音错误,通过三种不同级别的匹配策略来纠正单词。首先尝试完全匹配,接着忽略大小写进行匹配,最后尝试替换元音后的匹配,每一步都遵循特定的优先级规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

在给定单词列表wordlist的情况下,我们希望实现一个拼写检查器,将查询单词转换为正确的单词。对于给定的查询单词query,拼写检测器将会处理两类拼写错误:

  • 大小
  • 写:如果查询匹配单词拼写列表中的某个单词(不区分大小写),则返回的正确单词与单词列表中的大小写相同。
  1. 例如:wordlist = ["yellow"],query = "YellOw";correct = "yellow"
  2. 例如:wordlist = ["Yellow"],query = "yellow";correct = "Yellow"
  3. 例如:wordlist = ["yellow"],query = "yellow";correct = "yellow"
  • 元音错误:如果在将查询单词中的元音('a','e','i','o','u')分别替换为任何元音后,能与单词列表中的单词匹配(不区分大小写),则返回的正确单词与单词列表中的匹配项大小写相同。
  1. 例如:wordlist = ["YellOw"],query = "yellow";correct = "YellOw"
  2. 例如:wordlist = ["YellOw"],query = "yeellow";correct = ""(无匹配项)
  3. 例如:wordlist = ["YellOw"],query = "yllw";correct = ""(无匹配项)

此外,拼写检查器还按照以下优先级规则操作:

  • 当查询完全匹配单词列表中的某个单词(区分大小写)时,应返回相同的单词
  • 当查询匹配到大小写问题的单词时,您应该返回单词列表中的第一个这样的匹配项
  • 当查询匹配到元音错误的单词时,您应该返回单词列表中的第一个这样的匹配项
  • 如果该查询在单词列表中没有匹配项,则应返回空字符串

给出一些查询queries,返回一个正确单词答案列表answer,其中anwser[i]是由查询query = queries[i]得到的正确单词。

示例1

输入:wordlist = ["KiTe","kite","hare","Hare"],queries = ["kite","Kite","KiTe","Hare","HARE","Hear","hear","keti","keet","keto"]

输出:["kite","KiTe","KiTe","Hare","hare","","","KiTe","","KiTe"]

 

解题思路

根据检测器优先级规则,完全正确(区分大小写)->忽略大小写->元音错误(不区分大小写)->没有匹配项,设置三个vector分别保存原始wordlist,全部转换成小写单词,将每一个单词的元音替换成'_',然后依次查询。

vector<string> vec_best;
    vector<string> vec_ignore;
    vector<string> vec_del;
    string to_lower(string str){
        string res = "";
        for(int i=0;i<str.length();i++) res += tolower(str[i]);
        return res;
    }
    string del(string str){
        string res = "";
        for(int i=0;i<str.length();i++){
            char c = tolower(str[i]);
            if(c != 'a' && c != 'e' && c != 'i' && c != 'o' && c != 'u') res += str[i];
            else res += '_';
        }
        return res;
    }
    vector<string> spellchecker(vector<string>& wordlist, vector<string>& queries) {
        vector<string> ans;
        vector<string>::iterator it;
        int idx = 0,len;
        len = wordlist.size();
        for(int i=0;i<len;i++){
            vec_best.push_back(wordlist[i]);
            vec_ignore.push_back(to_lower(wordlist[i]));
            vec_del.push_back(to_lower(del(wordlist[i])));
        }
        len = queries.size();
        for(int i=0;i<len;i++){
            string s = queries[i];
            it = find(vec_best.begin(),vec_best.end(),s);
            idx = it - vec_best.begin();
            if(it == vec_best.end()){
                it = 
                    (vec_ignore.begin(),vec_ignore.end(),to_lower(s));
                idx = it - vec_ignore.begin(); 
                if(it == vec_ignore.end()){
                    it = find(vec_del.begin(),vec_del.end(),to_lower(del(s)));
                    idx = it - vec_del.begin();
                    if(it == vec_del.end()){
                        ans.push_back("");
                        continue;
                    }
                }
            }
            ans.push_back(wordlist[idx]);
        }
        return ans;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值