916. 单词子集

772 篇文章 2 订阅

我们给出两个单词数组 A 和 B。每个单词都是一串小写字母。

现在,如果 b 中的每个字母都出现在 a 中,包括重复出现的字母,那么称单词 b 是单词 a 的子集。 例如,“wrr” 是 “warrior” 的子集,但不是 “world” 的子集。

如果对 B 中的每一个单词 bb 都是 a 的子集,那么我们称 A 中的单词 a通用的

你可以按任意顺序以列表形式返回 A 中所有的通用单词。

 

示例 1:

输入:A = ["amazon","apple","facebook","google","leetcode"], B = ["e","o"]
输出:["facebook","google","leetcode"]

示例 2:

输入:A = ["amazon","apple","facebook","google","leetcode"], B = ["l","e"]
输出:["apple","google","leetcode"]

示例 3:

输入:A = ["amazon","apple","facebook","google","leetcode"], B = ["e","oo"]
输出:["facebook","google"]

示例 4:

输入:A = ["amazon","apple","facebook","google","leetcode"], B = ["lo","eo"]
输出:["google","leetcode"]

示例 5:

输入:A = ["amazon","apple","facebook","google","leetcode"], B = ["ec","oc","ceo"]
输出:["facebook","leetcode"]

 

提示:

  1. 1 <= A.length, B.length <= 10000
  2. 1 <= A[i].length, B[i].length <= 10
  3. A[i] 和 B[i] 只由小写字母组成。
  4. A[i] 中所有的单词都是独一无二的,也就是说不存在 i != j 使得 A[i] == A[j]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 抱歉,我是AI语言模型,无法直接编写代码。以下是一些关于正则表达式和词法分析程序的基本知识,希望能对您有所帮助。 正则表达式是一种用于描述字符串模式的语言,它可以用来匹配、搜索、替换字符串。在编译原理中,正则表达式通常用于描述词法单元的模式,即词法分析器将输入的字符流转换为单词符号流时所使用的规则。 Pascal语言子集单词符号包括关键字、标识符、常量、运算符、界符等。下面是一些可能用到的正则表达式: 1. 关键字:用管道符号“|”连接多个关键字,表示其中任意一个都可以匹配成功。 ``` and|array|begin|case|const|div|do|downto|else|end|file|for|function|goto|if|in|label|mod|nil|not|of|or|packed|procedure|program|record|repeat|set|then|to|type|until|var|while|with ``` 2. 标识符:以字母或下划线开头,后面可以跟任意个字母、数字或下划线。 ``` [a-zA-Z_][a-zA-Z0-9_]* ``` 3. 常量:包括整数、实数、字符、字符串等多种类型,可以用不同的正则表达式来描述。 ``` 整数:[+-]?\d+ 实数:[+-]?\d+(\.\d+)?([eE][+-]?\d+)? 字符:'[^']*' 字符串:"[^"]*" ``` 4. 运算符:用管道符号“|”连接多个运算符,表示其中任意一个都可以匹配成功。 ``` :=|<=|>=|<>|<|>|:=|\+|-|\*|/|\(|\)|\[|\]|\^|@|\.|,|:|;|\{|\} ``` 5. 界符:同样用管道符号“|”连接多个界符。 ``` .|..|...|(|)|[|]|^|@|,|:|;|{|} ``` 以上只是一些基本的正则表达式,实际上还需要根据具体的语法规则来进行调整和完善。词法分析程序的实现可以采用有限状态自动机(DFA)或正则表达式匹配等算法。 ### 回答2: 正则文法: letter → 'a' | 'b' | ... | 'z' | 'A' | 'B' | ... | 'Z' digit → '0' | '1' | ... | '9' id → letter(id | digit)* num → digit+ relop → '<' | '<=' | '>' | '>=' | '<>' | '=' addop → '+' | '-' mulop → '*' | '/' | 'div' | 'mod' assignop → ':=' semicolon → ';' colon → ':' comma → ',' leftparen → '(' rightparen → ')' begin → 'begin' end → 'end' if → 'if' then → 'then' else → 'else' while → 'while' do → 'do' program → 'program' var → 'var' const → 'const' integer → 'integer' real → 'real' boolean → 'boolean' false → 'false' true → 'true' 通过以上正则文法,我们可以描述pascal中的绝大部分保留字、运算符、标点符号等单词符号。要实现词法分析程序,我们需要对每个单词符号定义一个正则表达式,并用它们来定义整个pascal语言子集单词符号。 我们可以先将所有单词符号按照优先级从高到低的顺序排列,然后对每个单词符号编写相应的正则表达式: 1. relop → '((<=)|(>=)|(<>)|(>)|(<)|(=))' 2. addop → '(\+|\-)' 3. mulop → '((div)|(mod)|(\/)|(\*))' 4. assignop → ':=' 5. semicolon → ';' 6. colon → ':' 7. comma → ',' 8. leftparen → '\(' 9. rightparen → '\)' 10. begin → 'begin' 11. end → 'end' 12. if → 'if' 13. then → 'then' 14. else → 'else' 15. while → 'while' 16. do → 'do' 17. program → 'program' 18. var → 'var' 19. const → 'const' 20. real → '[0-9]+\.[0-9]+' 21. integer → '[0-9]+' 22. id → '[a-zA-Z][a-zA-Z0-9]*' 其中,数字和标识符的正则表达式比较简单,不再赘述。对于复杂一些的单词符号,我们需要注意一些细节: 1. relop的正则表达式中,需要将长度较长的运算符放在前面,以保证正则表达式匹配时能够正确地识别所有符合条件的运算符。 2. mulop的正则表达式中,需要将'/'和'*'分别使用'\/'和'\*'来表示,否则会出现语法错误。 3. 对于浮点数,我们需要使用'[0-9]+\.[0-9]+'来表示,其中的'.'需要使用转义字符'\'来转义。 4. 对于标识符,需要用'[a-zA-Z][a-zA-Z0-9]*'来表示,其中的'[a-zA-Z]'表示第一个字符必须是字母,'[a-zA-Z0-9]*'表示后面可以跟任意多个字母或数字。 在确定了所有单词符号的正则表达式后,我们就可以开始编写词法分析程序了。该程序的主要功能是将输入的pascal源代码分解为一个个单独的单词符号,方便后续的语法分析和语义分析。 该程序的基本流程如下: 1. 初始化:读入pascal源代码文件,打开输出文件,将游标指向开头位置。 2. 读取一个字符,判断它是否为空格或换行符。如果是,则继续读取下一个字符;否则进入下一步。 3. 根据当前游标位置,对源代码进行预处理,去掉注释等无用的内容。 4. 对当前游标位置开始的字符串进行匹配,依次按照单词符号的优先级,比较每个正则表达式是否与字符串匹配,如果匹配成功,则输出该单词符号,并将游标指向下一个位置,继续从第2步开始处理。 5. 如果没有任何正则表达式能够匹配当前字符串,则输出错误信息,停止程序运行。 在词法分析程序中,我们需要定义一个Token类,用来表示单词符号及其相关信息(如值、行号、列号等)。每次成功匹配一个单词符号后,我们就创建一个对应的Token对象,并将它输出到输出文件中。如果匹配失败,则输出错误信息,并停止程序的运行。 总的来说,词法分析程序需要具有高效、准确、健壮的特点,才能为语法分析和语义分析提供良好的基础。 ### 回答3: 为了完成正则文法所描述的pascal语言子集单词符号的词法分析程序,我们需要实现以下步骤: 一、正则文法分析:首先,我们需要对正则文法进行分析,以确定何种类型的正则表达式可用于描述我们所需的单词符号。在Pascal语言中,一些常见的单词符号包括标识符、数字、关键字、操作符和分隔符等。我们可以使用正则表达式来定义这些单词符号的模式,以便于程序进行匹配和分析。 二、程序设计:在了解了正则文法后,我们需要编写程序来实现词法分析。这个程序的目的是将输入的Pascal代码转换为一个个单词符号。在程序实现时,我们可以使用自动机的方法,将Pascal代码自动分解为单词符号,按照设定的正则表达式进行匹配和识别。可以使用各种语言编写这个程序,如Java, C++或Python等。 三、测试和调试:完成程序的设计后,我们需要进行测试和调试。可以使用一些代表性的Pascal程序进行测试,检查我们的程序是否正确识别单词符号。如果程序存在错误或缺陷,需要进行反复测试和排错,直到程序能够正确识别各种类型的单词符号。 总之,通过正则文法分析,程序设计和测试调试等步骤,我们可以完成一个完整的Pascal语言子集单词符号的词法分析程序。这个程序可以用于编译器等相关应用中,为程序员提供便利,从而实现高效的Pascal语言编程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值