鱼C论坛

 找回密码
 立即注册
查看: 2862|回复: 14

[已解决]Python:【新】每日一题 3

[复制链接]
发表于 2021-3-21 20:57:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 liuzhengyuan 于 2021-3-21 21:06 编辑

专辑说明(积分规则)

今天的题目:


给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循 pattern 所表示的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

请封装成一个函数,pattern,str 为参数

函数模板:
def wordPattern(pattern, s):
    """
    :type pattern: str
    :type s: str
    :rtype: bool
    """

示例1:

输入: pattern = "abba", str = "dog cat cat dog"
输出: true
示例 2:

输入:pattern = "abba", str = "dog cat cat fish"
输出: false
示例 3:

输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false
示例 4:

输入: pattern = "abba", str = "dog dog dog dog"
输出: false
限制:

你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。   

欢迎大家来答题


来源:力扣(LeetCode)
最佳答案
2021-3-22 12:29:26
def wordPattern(keys, s):

    values = s.split(' ')
    
    if len(keys) != len(values):
        return False

    dic1 = {}

    for i in range(len(keys)):
        if(keys[i] not in dic1.keys()):
            if(values[i] in dic1.values()):
                return False
            dic1[keys[i]] = values[i]
            
        else:
            if(dic1.get(keys[i]) != values[i]):
                return False

    return True
    
    pass


pattern = 'abbba'
str1 = 'dog cat cat cat dog'
print(wordPattern(pattern, str1))

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-21 22:14:53 | 显示全部楼层
本帖最后由 洋洋痒 于 2021-3-21 23:12 编辑
def wordPattern(pattern, s):
    if len(set(pattern))!=len(set(s.split())) or len(pattern)!=len(s.split()):
        return False
    L=s.split()
    count=0
    s=len(L)-len(set(L))
    for i in range(len(L)):
        count+=1
        if count>s:
            return True
        for j in range(i+1,len(L)):
            if L[j]==L[i] and pattern[j]!=pattern[i]:
                return False
    return True
print(wordPattern("abba","dog cat cat dog"))
print(wordPattern("abba","dog cat cat fish"))
print(wordPattern("aaaa","dog cat cat dog"))
print(wordPattern("aaaa","dog dog dog dog"))


我猜又会超时

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
liuzhengyuan + 2 + 2 出错了

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-21 22:41:00 | 显示全部楼层
def wordPattern(pattern, string):
  str_map = dict()
  string = string.split()
  for i, p in enumerate(pattern):
    if p in str_map.keys():
      if string[i] not in str_map[p]:
        return False
    else:
      str_map[p] = [string[i]]
  if len(set(pattern)) != len(set(string)): 
    return False
  return True

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
liuzhengyuan + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-21 23:25:29 | 显示全部楼层
def wordPattern(pattern, s):
    pattern_list = list(pattern)
    s_list = s.split(' ')
    length_s = len(s_list)
    length_p = len(pattern_list)
    if length_s != length_p:
        return False
    check_list = []
    for each in range(length_p):
        check_list.append([pattern_list[each], each])
    check_list.sort()

    for each in range(len(check_list) - 1):
        if check_list[each][0] == check_list[each + 1][0]:
            if s_list[check_list[each][1]] == s_list[check_list[each + 1][1]]:
                pass
            else:
                return False
    return True


print(wordPattern("abba", "dog cat cat dog"))
print(wordPattern("abba", "dog cat cat fish"))
print(wordPattern("aaaa", "dog cat cat dog"))
print(wordPattern("aaaa", "dog dog dog dog"))

单层 for 循环应该会快一点?

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
liuzhengyuan + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-22 07:43:58 | 显示全部楼层
我一直搞不懂这种题,是不能用函数么,还是匹配的功能要自己写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-22 09:03:20 | 显示全部楼层
本帖最后由 qq1151985918 于 2021-3-22 09:27 编辑
def wordPattern(pattern, s):
    pList,sList = list(pattern),s.split()
    if len(pList) != len(sList) or len(set(pList)) != len(set(sList)):
        return False
    Dict = {}
    for i in range(len(pList)):
        if pList[i] not in Dict.keys():
            Dict[pList[i]] = sList[i]
        else:
            if Dict[pList[i]] != sList[i]:
                return False
    return True

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
liuzhengyuan + 4 + 4 24ms 13.3mb

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-22 12:29:26 | 显示全部楼层    本楼为最佳答案   
def wordPattern(keys, s):

    values = s.split(' ')
    
    if len(keys) != len(values):
        return False

    dic1 = {}

    for i in range(len(keys)):
        if(keys[i] not in dic1.keys()):
            if(values[i] in dic1.values()):
                return False
            dic1[keys[i]] = values[i]
            
        else:
            if(dic1.get(keys[i]) != values[i]):
                return False

    return True
    
    pass


pattern = 'abbba'
str1 = 'dog cat cat cat dog'
print(wordPattern(pattern, str1))

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
liuzhengyuan + 4 + 4 12ms 12.9mb

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-22 17:04:02 | 显示全部楼层
def wordPattern(pattern: str, s:str):
    """
    :type pattern: str
    :type s: str
    :rtype: bool
    """
    strs = s.split(" ")
    if len(pattern) != len(strs): return False
    D = dict()
    for p, ss in zip(pattern, strs):
        # 根据规则p,去映射字典取字符串
        r = D.get(p, None)
        # 如果是None,说明当前规则没有录入
        if r is None:
            D[p] = ss
        # 如果有值,且和当前字符对不上,返回False
        elif r != ss:
            return False
    return True

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
liuzhengyuan + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-23 19:10:10 | 显示全部楼层
柿子饼同学 发表于 2021-3-22 07:43
我一直搞不懂这种题,是不能用函数么,还是匹配的功能要自己写

封装成函数更方便测试代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-23 20:50:52 | 显示全部楼层
-------------------------------------分割线-------------------------------
之后答题不会有奖励
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-24 16:57:41 | 显示全部楼层

输入:
"aba"
"dog cat cat"
结果错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-24 17:05:26 | 显示全部楼层

输入:
"aba"
"cat cat cat dog"
解答错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-24 17:06:48 | 显示全部楼层
Daniel_Zhang 发表于 2021-3-21 23:25
单层 for 循环应该会快一点?

输入:
"abba"
"dog dog dog dog"
输出:
true
预期结果:
false
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-24 17:13:18 | 显示全部楼层

输入:
"abba"
"dog dog dog dog"
输出:
true
预期结果:
false
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-24 17:32:47 | 显示全部楼层
liuzhengyuan 发表于 2021-3-24 17:06
输入:
"abba"
"dog dog dog dog"
def wordPattern(pattern, s):
    pattern_list = list(pattern)
    s_list = s.split(' ')
    length_s = len(s_list)
    length_p = len(pattern_list)
    if length_s != length_p:
        return False
    check_list = []
    for each in range(length_p):
        check_list.append([pattern_list[each], each])
    check_list.sort()
    print(check_list)

    for each in range(len(check_list) - 1):
        if check_list[each][0] == check_list[each + 1][0]:
            if s_list[check_list[each][1]] == s_list[check_list[each + 1][1]]:
                pass
            else:
                return False
        else:
            if s_list[check_list[each][1]] == s_list[check_list[each+1][1]]:
                return False
    return True

这样应该就可以了吧,漏了一种情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 01:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表