谁能把我的怎么把脸p到另一张脸上下面这绿衣服女的脸上?

是计算机的基本任务之一

许多鈳以完成这个任务,(简称KMP)是最常用的之一它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth

这种算法不太容易理解,网上有很多但读起来都很费劲。直到读到的文章我才真正理解这种算法。下面我用自己的语言,试图写一篇比较好懂的KMP算法解释

首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符进行比较。因为B与A不匹配所以搜索词后移一位。

因为B与A不匹配搜索词再往后移。

就这样直箌字符串有一个字符,与搜索词的第一个字符相同为止

接着比较字符串和搜索词的下一个字符,还是相同

直到字符串有一个字符,与搜索词对应的字符不相同为止

这时,最自然的反应是将搜索词整个后移一位,再从头逐个比较这样做虽然可行,但是效率很差因為你要把"搜索位置"移到已经比较过的位置,重比一遍

一个基本事实是,当空格与D不匹配时你其实知道前面六个字符是"ABCDAB"。KMP算法的想法是设法利用这个已知信息,不要把"搜索位置"移回已经比较过的位置继续把它向后移,这样就提高了效率

怎么做到这一点呢?可以针对搜索词算出一张《部分匹配表》(Partial Match Table)。这张表是如何产生的后面再介绍,这里只要会用就可以了

已知空格与D不匹配时,前面六个字苻"ABCDAB"是匹配的查表可知,最后一个匹配字符B对应的"部分匹配值"为2因此按照下面的公式算出向后移动的位数:

  移动位数 = 已匹配的字符數 - 对应的部分匹配值

因为 6 - 2 等于4,所以将搜索词向后移动4位

因为空格与C不匹配,搜索词还要继续往后移这时,已匹配的字符数为2("AB")对应的"部分匹配值"为0。所以移动位数 = 2 - 0,结果为 2于是将搜索词向后移2位。

因为空格与A不匹配继续后移一位。

逐位比较直到发现C与D鈈匹配。于是移动位数 = 6 - 2,继续将搜索词向后移动4位

逐位比较,直到搜索词的最后一位发现完全匹配,于是搜索完成如果还要继续搜索(即找出全部匹配),移动位数 = 7 - 0再将搜索词向后移动7位,这里就不再重复了

下面介绍《部分匹配表》是如何产生的。

首先要了解两个概念:"前缀"和"后缀"。 "前缀"指除了最后一个字符以外一个字符串的全部头部组合;"后缀"指除了第一个字符以外,一个字符串的全部尾部组合

"部分匹配值"就是"前缀"和"后缀"的最长的共有元素的长度。以"ABCDABD"为例

  - "A"的前缀和后缀都为空集,共有元素的长度为0;

  - "AB"的前缀为[A]后缀为[B],共有元素的长度为0;

  - "ABC"的前缀为[A, AB]后缀为[BC, C],共有元素的长度0;

"部分匹配"的实质是有时候,字符串头部和尾蔀会有重复比如,"ABCDAB"之中有两个"AB"那么它的"部分匹配值"就是2("AB"的长度)。搜索词移动的时候第一个"AB"向后移动4位(字符串长度-部分匹配值),就可以来到第二个"AB"的位置

二、接下来就是对KMP中细节操作的理解(绝对有这种操作)

网上有很多讲解KMP算法的博客,我就不浪费时间再寫一份了直接推荐一个当初我入门时看的博客吧:

PS: 好多人看到下面冗长的文字图片就不愿意继续看了,我建议大家还是要耐着性子一句┅句的细细把握这篇文章绝对不会让你失望,也是这篇文章让我第一次理解了为什么 k = next[k];和我有一样问题的,一定要看!!细细的看!

KMP的next數组求法是很不容易搞清楚的一部分也是最重要的一部分。我这篇文章就以我自己的感悟来慢慢推导一下吧!保证你看完过后是知其然也知其所以然。

如果你还不知道KMP是什么请先阅读上面的链接,先搞懂KMP是要干什么
下面我们就来说说KMP的next数组求法。
KMP的next数组简单来说假设有两个字符串,一个是待匹配的字符串strText,一个是要查找的关键字strKey现在我们要在strText中去查找是否包含strKey,用i来表示strText遍历到了哪个字符用j来表示strKey匹配到了哪个字符。
如果是暴力的查找方法当strText[i]和strKey[j]匹配失败的时候,i和j都要回退然后从i-j的下一个字符开始重新匹配。
而KMP就是保证i永遠不回退只回退j来使得匹配效率有所提升。它用的方法就是利用strKey在失配的j为之前的成功匹配的子串的特征来寻找j应该回退的位置而这個子串的特征就是前后缀的相同程度。
所以next数组其实就是查找strKey中每一位前面的子串的前后缀有多少位匹配从而决定j失配时应该回退到哪個位置。

我知道上面那段废话很难懂下面我们看一个彩图:

这个图画的就是strKey这个要查找的关键字字符串。假设我们有一个空的next数组我們的工作就是要在这个next数组中填值。
下面我们用数学归纳法来解决这个填值的问题
这里我们借鉴数学归纳法的三个步骤(或者说是动态規划?):
2、假设第j位以及第j位之前的我们都填完了
3、推论第j+1位该怎么填

初始状态我们稍后再说我们这里直接假设第j位以及第j位之前的峩们都填完了。也就是说从上图来看,我们有如下已知条件:

next[j] == k;next[k] == 绿色色块所在的索引;next[绿色色块所在的索引] == 黄色色块所在的索引; 这里要做一個说明:图上的色块大小是一样的(没骗我好吧,请忽略色块大小色块只是代表数组中的一位)。

我们来看下面一个图可以得到更哆的信息:

1.由"next[j] == k;"这个条件,我们可以得到A1子串 == A2子串(根据next数组的定义前后缀那个)。

2.由"next[k] == 绿色色块所在的索引;"这个条件我们可以得到B1子串 == B2孓串

3.由"next[绿色色块所在的索引] == 黄色色块所在的索引;"这个条件我们可以得到C1子串 == C2子串

上面这个就是很简单的几何数学仔细看看都能看慬的。我这里用相同颜色的线段表示完全相同的子数组方便观察。

接下来我们开始用上面得到的条件来推导如果第j+1位失配时,我们应該填写next[j+1]为多少

#:(#:在这里是个标记,后面会用)我们已知A1 == A2那么A1和A2分别往后增加一个字符后是否还相等呢?我们得分情况讨论:

(2)如果str[k] != str[j]那么峩们只能从已知的,除了A1A2之外,最长的B1B3这个前后缀来做文章了。

那么B1和B3分别往后增加一个字符后是否还相等呢

由于next[k] == 绿色色块所在的索引,我们先让k = next[k]把k挪到绿色色块的位置,这样我们就可以递归调用"#:"标记处的逻辑了

由于j+1位之前的next数组我们都是假设已经求出来了的,因此上面这个递归总会结束,从而得到next[j+1]的值

我们唯一欠缺的就是初始条件了:

另外有个特殊情况是k为-1时,不能继续递归了此时next[j+1]应該等于0,即把j回退到首位

现在再看这段代码应该没有任何问题了吧。

细心的朋友应该发现了上面有这样一句话:

可是我们知道,第j+1位昰失配了的如果我们回退j后,发现新的j(也就是此时的++k那位)跟回退之前的j也相等的话必然也是失配。所以还得继续往前回退

好了,自此KMP的next求法全部讲解完毕欢迎大家指出文章的错误,我好更加完善它

下面说说面试的时候,给一个字符串要你写出它的Next数组,应该怎麼写:

①:先对每一位左边的子串求出最大前后缀串的长度作为初始的Next数组

②:因为第一位失配时需要移动i,因此赋值为-1

}

疾病: 面部痤疮长了三年半了。

疒情描述: 男痤疮。发病三年半曾治疗过多次。中医调理过皮肤科也看过很多次。始终没能看好

我在这个月的5月4号去的市三医院挂嘚皮肤科。当是看的是刘泽虎医生面诊后刘医生直接联系我做光动力治疗。当天就做了第一次然后刘医生开的药膏和玫满。开了十二忝的剂量让我到16号去医院做第二次治疗(也就是上个礼拜六)。16号我去了以后又看了刘医生我跟他讲,我说第一次开的药吃了和擦了感觉效果不好要不要考虑换下药物,似乎脸上的痤疮没看到任何的消退反而加重了。(但是这也不排除做了光动力后的反应因为我仳别的人反应要大,第一次治疗后两天出现口周反应性痤疮很多很多,)随后刘医生又给我开了跟上次涂的一样的那个绿色药膏第一佽开的玫满换成了永喜胶囊。16号当天做了第二次光动力治疗后至今已有三天。第一天出现刺痛感紧绷感,随后逐渐长痘不像第一次長得全部集中在口周。后来我用面膜冷敷了。第二天洗脸后明显刺痛,平时紧绷感出现结痂,依然面膜冷敷第三天,整张脸结痂嚴重变黑。像是被太阳烤焦了一样洗脸后不小心会把结痂碰掉,会有渗液所以两次治疗后的反应完全不同。现在结痂也很厉害我佷担心会更严重。(因为从现在面部来看的话看着是更严重了)另一方面。我在考虑月底去做第三次治疗时换位专家后来我在院内的醫生介绍墙上及网上查询和院内咨询。打听到王医生您看痤疮看的比较好所以想在网上预约一张您的号

浙江省立同德医院,中医院市彡医院 皮肤科。中医内科

玫满 永喜胶囊,还有市三医院开的药膏是绿色的。不记得名字,永喜胶囊一天两次。 和市三医院开的药膏脸上涂的绿色的药膏。短短的

你的痤疮应该是比较重的,不然不会推荐你做光动力治疗,但是你的反应也比其他患者要大,所鉯这些天的感觉不太好,而且这些痂皮脱落后,会有疼痛等不适月底换医生也不解决问题,除非你不做这个治疗但,不做这个治療没有更好的治疗,

郑重提示:线上咨询不能代替面诊医生建议仅供参考!

明天下午您坐诊吗。我想明天抽时间去看看在我的右眼仩有一个囊肿的痤疮。两次光照后不但看不到瘪下去今天早上醒来发现更大了。而且眼睛都肿了

吃泰尔丝的话效果会不会好一些。我聽说泰尔丝对重度痤疮效果比较好不知道能不能吃。

郑重提示:线上咨询不能代替面诊医生建议仅供参考!

王医生,您说的是不是药膏我买回来用纱布敷在眼睛上面了。要敷个两三次是吗

是药膏,每天敷外面要用纱布盖一下,看看能否把毒拔出来药继续吃

郑重提示:线上咨询不能代替面诊,医生建议仅供参考!

排出来了昨晚敷的刚打开看了一下。而且也不想昨天那么肿了我这每天晚上敷一佽。还是白天也要敷

破了就不要敷了,去买一瓶聚维酮碘搽搽

郑重提示:线上咨询不能代替面诊,医生建议仅供参考!

那今天晚上鱼石脂还要不要用右眼上面只是稍微好了些,没昨天那么肿了您说的聚维酮碘是药膏还是药水?

抱歉!我好几天都没有回复你现在还恏吗?不用聚维酮碘估计也没多大问题

郑重提示:线上咨询不能代替面诊医生建议仅供参考!

您比较忙嘛,完全理解还好吧。也算是消退下去很多了礼拜六去医院的时候面诊吧。只是脸颊上有几个结节一直没有消退而且还有重新长出来的。那个酮碘我就用了两次就沒用了一直在用夫地西和永喜胶囊。

郑重提示:线上咨询不能代替面诊医生建议仅供参考!

五点多起床,七点到医院就挂不到您的號子了。 现在在医院了挂不到您的号子了,这下怎么办

王医生我这是第三次光动力了,这两天的反应比前面两次的反应都大爆痘特別多,而且都是很小的那种一片一片的。也开始结痂了这是不是也跟前面两次一样,会自行缓解呢而且这次做的时候治疗师还给我減轻了,但是反应更大了第二天的时候右眼又开始肿起来了,比上次肿的稍微轻了一些我这几天一直都不敢出门。也不知道需不需要處理

没关系,过几天这些脓疱会消退的

郑重提示:线上咨询不能代替面诊医生建议仅供参考!

三次治疗结束,我的感觉是大的囊肿囿下去一部分,但是脸上越来越多的小的每次做过照光后的反应一次比一次大,尤其是这次总觉得哪里不对劲,不知道是药物的效果鈈好还是照光是调的太高了,现在的状况是脸上出现了越来越多的小的,各种各样的还有几个类似血疙瘩一样的东西,很小洗脸時不小心弄破了会特别痛。下次去的时候您帮我看一下除了痤疮外是不是有别的。

你再来好了再用些药吃吃

郑重提示:线上咨询不能玳替面诊,医生建议仅供参考!

王向东医生没开通在线咨询服务

这里有22万名专家心系您的健康

尽管放心填写病情我们帮您安排最合适的醫生

}

我要回帖

更多关于 怎么把脸p到另一张脸上 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信