zoukankan      html  css  js  c++  java
  • Python算法系列-单词匹配模式【hash练习】

    在这里插入图片描述

    一、问题描述

    给定两个字符串,一个是单词模式字符串,另一个是目标字符串。之后检查目标字符串是否为给定得单词模式,即求目标字符串中单词出现的规律是否和单词模式字符串中的规律相同。
    例如:单词模式字符串为“—二二一”,目标字符串为“苹果香蕉香蕉苹果",二者得规律一样,匹配成功。
    在这里插入图片描述

    二、涉及知识点

    1. python中的输入输出模块
    2. python中的函数定义方法
    3. python中循环模块
    4. python中的条件判断语句

    三、问题分析

    • 这个问题我们主要要寻找对应关系 ,当单词模式字符串和目标字符串值存在一一映射关系时,说明两个字符串匹配成功
    • 以本题来说,我们建立模式字符串中的每个字符和目标字符串中每个单词之间的映射关系。而哈希表本身是一种映射关系,因此我们可以使用哈希算法。来存储这种关系。
      第一项任务是建立哈希表来存储数据,由于不仅需要排除一个模式对应多个字符串的情况还需要排除。多个模式对应一个字符串的情况,我们需要建立两个哈希表。
      hash用来存储模式的字符串和目标字符串的对应关系。
      used用来记录已经使用过的目标字符串

    四、代码构建

    def  wordmatch (word ,input0):
    	input1 = input0.split(' ') #将目标字符串中单词以空格分开
    	words = word.split(' ') #模式字符串也以空格分开
    	if len (input1) != len (words): #判断字符串长度是否一致
    		return False
    	hash = {} # 记录连个字符串的对应关系
    	used = {} #记录使用过的字符串
    	for i in range(len(words)): # 遍历整个字符串
    		if words[i] in hash : #判断检查模式的字符串是否被记录过映射关系
    			if hash[words[i]] != input1[i] : #检查映射关系是否一致
    				return False 
    		else : 
    			if input1[i] in used: #检查单词是否使用过
    				return False
    			hash [words[i]] = input1[i] #第一次出现,加入hash表
    			used[input1[i]] = True # 记录那些单词使用过
    	return True
    
    a = input('请输入模式字符串:')	
    b = input ('请输入目标字符串:')	
    s = wordmatch(a,b) #调用函数
    print('输入词组是否匹配:',s)
    
    

    五、运行调试

    **在这里插入图片描述**

    • 我们这里要求输入的模式字符串和目标字符串都要以空格隔开
    • 这里我们运行程序 输入模式字符串,然后输入目标字符串,然后返回我们规律的判断结果,这就是我们要打到模式匹配的效果。

    五、相关知识补充

    1.一一映射:就是集合A和集合B中的元素可以相互映射,且一一对应,常见一一映射如 学生身份证号和学号
    2.字符串转换成列表:
    str.split(sep=None, maxsplit=-1)
    返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串。 如果给出了 maxsplit,则最多进行 maxsplit 次拆分(因此,列表最多会有 maxsplit+1 个元素)。 如果 maxsplit 未指定或为 -1,则不限制拆分次数(进行所有可能的拆分)。

    如果给出了 sep,则连续的分隔符不会被组合在一起而是被视为分隔空字符串 (例如 ‘1,2’.split(’,’) 将返回 [‘1’, ‘’, ‘2’])。 sep 参数可能由多个字符组成 (例如 ‘1<>2<>3’.split(’<>’) 将返回 [‘1’, ‘2’, ‘3’])。 使用指定的分隔符拆分空字符串将返回 [’’]。

    例如

    >>>
    >>> '1,2,3'.split(',')
    ['1', '2', '3']
    >>> '1,2,3'.split(',', maxsplit=1)
    ['1', '2,3']
    >>> '1,2,,3,'.split(',')
    ['1', '2', '', '3', '']
    

    如果 sep 未指定或为 None,则会应用另一种拆分算法:连续的空格会被视为单个分隔符,其结果将不包含开头或末尾的空字符串,如果字符串包含前缀或后缀空格的话。 因此,使用 None 拆分空字符串或仅包含空格的字符串将返回 []。

    例如

    >>>
    >>> '1 2 3'.split()
    ['1', '2', '3']
    >>> '1 2 3'.split(maxsplit=1)
    ['1', '2 3']
    >>> '   1   2   3   '.split()
    ['1', '2', '3']
    
  • 相关阅读:
    shapely and geos break在distance方法
    linux运维
    【未完待补充】linux 设置So动态库链接路径
    用python建立最简单的web服务器
    nginx + keepalived 双机热备
    nagios监控linux主机监控内存脚本
    linux普通用户权限设置为超级用户权限方法、sudo不用登陆密码
    zato server启动后自动关闭问题解决
    Linux下几种文件传输命令 sz rz sftp scp
    python风味之大杂烩
  • 原文地址:https://www.cnblogs.com/tianyao2020/p/12755218.html
Copyright © 2011-2022 走看看