一、单词模式匹配

描述:单词模式字符串为“一二二一”,目标字符串为"苹果 香蕉 香蕉 苹果"则匹配成功

a=[1,2,2,1,1,3]
b=['x','y','y','x','x','z']
def word_pattern(a,b):
#如果a,b长度不一致则直接返回False
if len(a)!=len(b):
return False
#用来存储映射关系
#例如{1:'x',2:'y',3:'z'}
hash={}
#用来存储是否被使用
#如果a=[1,1,2],b=['x','y','z']
#那么1:'y'就重复使用了,就返回False
used={}
for i in range(len(a)):
if a[i] in hash:
#不是第一次出现,检查映射关系是否匹配
if hash[a[i]]!=b[i]:
return False
else:
#检查这个单词是否使用过,使用过则返回False
if b[i] in used:
return False
hash[a[i]]=b[i]
used[b[i]]=True
return True
print(word_pattern(a,b))

二、猜词游戏

比如秘密数字“2018”,猜测数字"8021",我们可以看到0位置猜对了,我们记为A,其余数字虽然猜对了但是位置不对,我们每个记为B,输出则有1A3B;

在比如秘密数字“1123”,猜测数字“9111”,我们发现猜测数字第二个数字与秘密数字相匹配,于是我们有1A,匹配的数字就不会再被使用,由于还有1,所以我们有1B,最终我们返回1A1B;(注意,我们保证的是秘密数字和猜测数字的位数是一致的)

解法:对于A的个数,我们直接判断有多少位是相等的即可,对于B的判断,我们只需要每次取得匹配的最小的数目即可;

a=""
b=""
def gethint(a,b):
A=0
B=0
a_dict={}
b_dict={}
for i in range(len(a)):
if b[i] == a[i]:
A+=1
else:
if b[i] in b_dict:
b_dict[b[i]]=b_dict[b[i]]+1
else:
b_dict[b[i]]=1
if a[i] in a_dict:
a_dict[a[i]] = a_dict[a[i]] + 1
else:
a_dict[a[i]]=1
for digit in b_dict:
if digit in a_dict:
B+=min(a_dict[digit],b_dict[digit])
return str(A)+"A"+str(B)+"B"
print(gethint(a,b))
输出:1A1B

三、神奇的词根

问题描述:给定一个由许多词根组成的字典和一个句子,你需要将句子的所有继承词用词根替换掉,如果继承词中有许多它的词根,则用最短的词根来替换掉它;

方法一:直接暴力法

a=["catt","cat","bat","rat",]
b="the cattle was rattled by the battery"
def replacewords(a,b):
b=b.split(" ")
for i in a:
for j in range(len(b)):
if b[j][:len(i)]==i:
b[j]=i
return " ".join(b)
print(replacewords(a,b))

方法二:利用hash

a=["catt","cat","bat","rat",]
b="the cattle was rattled by the battery"
def replacewords(a,b):
import collections
b=b.split(" ")
a_dict=collections.defaultdict(set)
b_dict=collections.defaultdict(int)
for w in a:
a_dict[w[0]].add(w)
b_dict[w[0]]=max(b_dict[w[0]],len(w))
print(a_dict,b_dict)
for i,w in enumerate(b):
for j in range(b_dict[w[0]]):
if w[:j+1] in a_dict[w[0]]:
b[i]=w[:j+1]
break
return " ".join(b)

a_dict:defaultdict(<class 'set'>, {'c': {'cat', 'catt'}, 'b': {'bat'}, 'r': {'rat'}})

b_dict:defaultdict(<class 'int'>, {'c': 4, 'b': 3, 'r': 3})

输出:the cat was rat by the bat

hash算法的应用的更多相关文章

  1. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  2. 一致性hash算法详解

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  3. 一致性hash算法简介

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希 ...

  4. 分布式缓存技术memcached学习(四)—— 一致性hash算法原理

    分布式一致性hash算法简介 当你看到“分布式一致性hash算法”这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几 ...

  5. 一致性 hash 算法( consistent hashing )a

    一致性 hash 算法( consistent hashing ) 张亮 consistent hashing 算法早在 1997 年就在论文 Consistent hashing and rando ...

  6. 暴雪HASH算法(转)

    暴雪公司有个经典的字符串的hash公式 先提一个简单的问题,假如有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做? 有一个方法最简单,老老实实 ...

  7. hash算法总结收集

    hash算法的意义在于提供了一种快速存取数据的方法,它用一种算法建立键值与真实值之间的对应关系,(每一个真实值只能有一个键值,但是一个键值可以对应多个真实值),这样可以快速在数组等条件中里面存取数据. ...

  8. MurmurHash算法:高运算性能,低碰撞率的hash算法

    MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop.libstdc++.nginx.libmemcached等开源系统.2011年A ...

  9. 一致性hash算法简介与代码实现

    一.简介: 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance) 2.单调性(Monotonicity) 3.分散性(Spread) 4.负 ...

  10. hashmap的hash算法( 转)

    HashMap 中hash table 定位算法: int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); 其中i ...

随机推荐

  1. Spring 梳理-JdbcTemplate简介

    JdbcTemplate简介 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中. JdbcTempla ...

  2. unzip 命令指定解压路径

    在使用unzip进行文件包解压,可以用来解压zip/jar/war包类型,有时解压时需要解压到指定路径时可以使用参数 -d 来指定,例如: unzip services-bak.jar -d ./we ...

  3. layDate——设置最大日期不能超过当前日期

    例如,当前年份是2018年,实现效果如下,2018年之后年份不可操作: 具体代码实现: layui.use([ 'laydate'], function () { var laydate = layu ...

  4. Spring Cloud Gateway 使用

    简介 Spring Cloud Gateway是Spring Cloud官方推出的网关框架,网关作为流量入口,在微服务系统中有着十分重要的作用,常用功能包括:鉴权.路由转发.熔断.限流等. Sprin ...

  5. WebGL简易教程(七):绘制一个矩形体

    目录 1. 概述 2. 示例 2.1. 顶点索引绘制 2.2. MVP矩阵设置 2.2.1. 模型矩阵 2.2.2. 投影矩阵 2.2.3. 视图矩阵 2.2.4. MVP矩阵 3. 结果 4. 参考 ...

  6. mysql root密码忘记

    首先停掉mysql服务,在/etc/my.cnf中添加 skip-grant-tables,同时可以添加skip-networking选项来禁用网络功能,防止这时其他人通过网络连接到数据库 [mysq ...

  7. BMap添加海量点数据,BMap.Point携带数据

    在开发web项目的过程中使用到了百度地图,由于要在地图中画出很多点比较影响加载速度,查看官方文档,发现有提供加载海量点的功能BMap.PointCollection,用这个加快速度,但是官方文档中提供 ...

  8. 在ZYBO板卡上实现PL-PS交互(通过AXI的方式)

    前情提要:参考的是下面所说的原网页,只是原作者用的是vivado 2014.4,我用vivado 2018.2跑的,图是新的,内容大多“换汤不换药”,但是我在做的时候存在一些问题,我记录了下来并将解决 ...

  9. Java 学习笔记之 线程interrupted方法

    线程interrupted方法: interrupted()是Thread类的方法,用来测试当前线程是否已经中断. public class InterruptThread extends Threa ...

  10. IDEA 学习笔记之 1.5已经过时问题

    1.5已经过时问题: apache-maven-3.5.0\conf\settings.xml添加: <profile> <id>jdk-1.8</id> < ...