dfas 2017-08-04T17:07:32+08:00 kejinlu@gmail.com 2017-08-04T17:07:32+08:00 dfas http://tyctac.github.io/2017/08/2017-02-16-编程心得 字符串 正则表达式:获取数字: ```str = str.strip()
str = re.findall(‘(^[+-0]\d+)\D‘,str)


**时间复杂度**  
python 的类型转换,eg:set <=> list

**java**   
- ArrayList的ArrayList存放的是引用吗??就是说将ArrayList 赋值给数组元素后,改变原来的ArrayList,会改变ArrayList中的相应元素吗??

**数组对象**  

**用'*'初始化二维数组**  
不能正常赋值的原因是,*是对对象引用的赋值,所以改变该对象会改变所有指向它的引用

#### 有用的技巧
**python**  
- 字符串之间的赋值是传值,不是传引用
- min(list,key),list是需要比较的数组,key是作用于list中每个元素的函数,min返回函索返回值最小的那个原始list中的对应元素  
enumerate(iterable[,start]) -> iterator for index,value of iterable  
- 将一个对象追加到数组中时候,再改变该对象的值不会改变数组中对应的值,e.g.  

In [1]: ar = []

In [2]: dicar = {‘age’:2}

In [3]: ar.append(dic dicar dict

In [3]: ar.append(dicar)

In [5]: dicar = {‘name’:’xiaoming’}

In [6]: ar Out[6]: [{‘age’: 2}]

```

  • 正则匹配ip,参考
    互动问题解答:

=============================================================================

问题记录

  • 在一个平面中,给出很多一样大小的正方形,然后给出很多点,要求查询每个点落在多少正方形内。kd树??
]]>
2017-test 2017-07-13T00:00:00+08:00 dfas http://tyctac.github.io/2017/07/logic_problem 腾讯科技讯(木语)6月14日消息,苹果公司在招聘员工时,会向求职者问一些“可汗学院”(Khan Academy)提出的考验智商的谜题。 你可能没听说过“可汗学院”,但“可汗学院”的谜题被苹果采用一定是有其道理的。可汗学院由孟加拉裔美国人萨尔曼•可汗(Salman Kahan)创立,是一家由谷歌和比尔&梅琳达•盖茨基金会背后支持的教育性非营利组织,主旨在于利用网络影片进行免费授课,目前已经有关于数学、历史、金融、物理、化学、生物、天文学等科目的内容。 苹果在面试过程中随时都有可能向求职者抛出这些考验智商与逻辑的问题,因此如果你向往进入苹果工作,这些艰涩的问题在面试前必须谨慎对待仔细研究,因为苹果的原则是——不能出错,哪怕你已经级别很高,是冲着苹果的高级软件工程师职位而来也不例外。 幸运的是,这些问题虽然刁钻,但却都有唯一的答案,所以你只要有备而来,还是可以应对自如的,下面是8个苹果面试过程中求职者可能遇到的问题,以及已经被各路聪明的求职者破解的答案。 问题一: “你面前有两扇门,其中一扇门内藏着宝藏,但如果你不小心闯入另一扇门,只能痛苦地慢慢死掉……” 这一听就是那种经典的最令人头痛的一类问题,但其实与其他问题相比,这只是个热身。在这两扇门后面,有两个人,这两个人都知道哪扇门后有宝藏,哪扇门擅闯者死,而这两个人呢,一个人只说真话,一个人只说假话。 谁说真话谁说假话?那就要看你有没有智慧自己找出来了,游戏规则是,你只能问这两个人每人一个问题。 那么,你问什么问题?问哪个人?根据他们的回答,你又该怎么做? 求职者的最佳答案: 随便问其中一个人:“如果我问另一个人,他会跟我说哪扇门后是宝藏? 如果你问的恰好是讲真话的那个人,那他指给你的答案就是那扇通向死亡的门,因为他会诚实地告诉你那个说谎的人会怎么说。 如果你问的是那个只说谎话的,你得到的也是错误的答案,因为另一个人是讲真话的,说谎话的人会告诉你与讲真话的人相反的答案。 所以你只要随便问一个人上述问题,然后选择与他们说的相反的门就行了。 问题二: “你前面站了5个人,他们中间只有一个人讲真话……” 这个问题比上个问题难就难在,你只知道他们五个中有一个只讲真话,但其余四个,他们有时候讲真话,有时候讲假话,只有一点可以确定,这四个人将真话和假话有个规律:如果这次讲了真话,下次就会讲假话,如果这次讲假话,下次就讲真话。你的任务是,把五个人中那个只讲真话的人找出来。 你可以问两个问题,两个问题可以向同一个人发问,也可以分别问两个人。 你该问什么问题? 小提示:你可以这样安排两个问题承担的任务:首先你可以先问一个问题,不管得到的答案是什么,你都能从中知道下一个问题你将得到的答案是真是假。 求职者的最佳答案: 随便找一个人,首先问:“你是那个只讲真话的吗?”如果答案是肯定的,你再问这个人:“谁是只讲真话的?”;如果第一个问题你得到的答案是否定的,你就再问对方“谁不是只讲真话的?” 正如这个问题给出的提示,第一个问题的价值在于,如果你得到的答案是“我是”,那么你问的人要么是那个只讲真话的,要么是那个这一轮讲假话的“半真话半假话”者,不管是谁,他下一轮一定会说真话。所以你可以继续问这个人:“谁是只讲真话的?”对方的答案就是正确答案。 如果对第一个问题你得到的答案是“我不是”,那么回答者不可能是只讲真话的那个人,只能是一个此轮讲真话的“半真话半假话”者。此人下一轮将会说假话,所以你应该问他:“谁不是只讲真话的?”同样他告诉你的,只能是那个只讲真话的。 问题三: “外星人打算将地球用来种蘑菇,并且已经抓了十个人类……” 外星人用这十个人代表地球60亿人口,将通过外星人的方式来测试这十个人,决定地球是不是有资格加入跨星际委员会,如果没有,就把地球变成一个蘑菇农场。 明天,这十个人将被关在一间漆黑的屋子里前后排成一队,外星人将给每个人戴一顶帽子,帽子为紫色或者绿色,然后外星人会将灯打开,这十个人每个人都无法看见自己头上的帽子是什么颜色,但可以看见排在你前面的每个人头上帽子的颜色。 帽子的颜色是随机的,可能全是紫的,也可能全是绿的,或者是任意的组合。 外星人会从后往前问每一个人:“你头上的帽子是什么颜色?”如果这个人答对了,这个人就安然无事,他所代表的地球上6亿人口也将获救。否则,这个人将被爆头,外星人将把他所代表的6亿人口变成蘑菇的肥料。每个人的答案屋子里所有人都可以听到。 现在,人类的命运在你手上,你可以设计一个方案,使这十个人提前制定一个计划,这个计划必须拯救尽可能多的人。 提示:有个方案可以让你拯救其中至少九个人。 求职者的最佳答案: 第十个人计算排在前面的所有人的绿帽子是奇数还是偶数并向前面的人发出一个信号,这样排在前面人就可以再通过排在更前面的所有人的绿帽子的奇偶数是否变化来判断自己帽子的颜色,因为如果绿帽子奇偶发生变化,那自己就是那个导致变化的“绿帽子”,如果没变化,自己就是“紫帽子”。 因为所有的人除了回答外星人的问题不能说话,所以第十个人的“信号”只能包含在自己的答案里,比如如果排在前面的九个人有奇数顶绿帽子,这个人类就告诉外星人自己的帽子是“绿色”,如果是偶数,就猜自己的帽子是“紫色”。这样等于给他前面的人一个暗号,排在他前面的这个人,可以通过计算自己前面的所有人的绿帽子的奇偶变化来判断自己的帽子是绿还是紫。 排在最后的那个人为了大众利益没有选择,根据前面的人的帽子情况告诉外星人自己是“绿帽子”还是“紫帽子”,他的答案有1/2的几率正确,但他前面的人一定都能答对。 还没懂?比如第十个人看到前面有奇数个绿帽子,他就告诉外星人自己的是绿色,这是他前面的人就知道他的意思是前面九个人中有奇数个绿帽子,这是第九个人再数前面八个人的,如果前面八个人中也有奇数个,那自己就是紫色帽子。第九个人告诉外星人自己是紫色帽子,第八个人就知道绿帽子没有减少还是奇数个,再数数前面七个人绿帽子数的奇偶,就可以判断自己帽子的颜色;反之,如果第九个人告诉外星人自己是绿色帽子,那第八个人就应该知道绿色帽子减少了一个由奇数变成了偶数,再看看前面所有的绿帽子情况作出判断。这样一个接一个,只要每个人都认真听后面的人的答案并在心里计算所剩绿帽子的奇偶变化,前面九个人都能获救。 当然,你也可以计算紫色帽子的奇偶。 问题四: “100个完美的逻辑学家坐在一个房间里……” 这是一个电视真人秀节目,节目里100个拥有完美无瑕逻辑思维能力的人围成一圈坐在一个房间里。在进入房间前,这100个人被告知,100个人中至少有一个人的额头是蓝色的。你可以看见别人额头的颜色,但无法看到自己的,你需要对自己额头是不是蓝色进行猜测,在房间的灯被关掉时,如果你推测出你的额头是蓝色的,你需要站起来离开房间。 然后房间的灯被再次打开,那些认为自己额头是蓝色的人已经不在屋内。接下来灯会再次被关掉,剩下的人中推测自己额头是蓝色的离开房间,如此重复。 问题来了,假设这100个人的额头都是蓝色的,将会发生什么情况?注意,这100个人都有完美无瑕的逻辑推理能力,他们会根据其他人的额头颜色对自己进行合理的推理和猜测。 提示:想想看,如果100个人不全是蓝色额头,又会发生什么情况? 求职者的最佳答案: 将会出现的情况是:灯关了又开,开了又关,重复到第一百次时,所有人都同时离开。 这是为什么呢?想想看,每个人都看见其他99个人额头是蓝色的,灯关掉后再打开,发现这99个蓝色额头的同伴都没有离开,然后灯再次关掉后打开,如此重复100遍后,所有人同时离开了房间。 这么理解吧,假设只有一个人的额头是蓝色的,由于这100个人事先被告知至少有一个人额头是蓝色,所以这个人如果看到其他99个人额头都不是蓝色,立马就知道自己是蓝色,所以灯一关掉,这个人就会离开房间。 如果有两个人额头是蓝色呢? 其中一个蓝色额头的人会想:我的额头可能是蓝色也可能不是蓝色,现在其他99个人中有一个蓝色额头的人,如果我不是蓝色,那么就只有这一个人是,那么他看到我们都不是蓝色额头就能推断出他是,那么灯一关他就会离开,我先等一下,灯再打开如果他已经走了,那就证明我的额头不是蓝色的。 反之,如果我的额头是蓝色的,那个蓝色额头的人的想法会和我刚才的想法一样先等一等,第一次关灯他不会离开,这样如果灯开了那个蓝色额头的人还在,就证明我的额头也是蓝色的。这样第二次关灯我们俩会一起离开。 以此类推,如果有三个人额头是蓝色,你看到另外两个人额头是蓝色,应该推算出如果自己的额头不是蓝色的话,那么灯第二次关的时候他们俩会同时离开,如果他们俩没有同时离开,那就证明我的额头是蓝色的,我应该在第三次关灯的时候离开。结果是,三个蓝色额头的人在第三次关灯的时候同时离开。 把上述逻辑重复一百遍,你就得到了最上面的正确答案。 问题五: “你有一个横6竖6的方格……” 你现在在左上第一个格子里,你的任务是移动到最右下脚的格子里,你每次只能向右或者向下移动,不能斜向移动,也不能后退。 你能找出几种方法移动到最右下脚的格子? 求职者的最佳答案: 252种。 从对称的角度思考这个问题。 随便挑选一个格子,假设你从出发点有n种方法从到达与所选格子上边相邻的格子,m种方法到达与它左边相邻的格子。 想想看,从出发点到达一个格子的方法与到达它左边和上边的格子的方法有什么关系?说对了,由于你只能向右和向下移动,到达一个格子,不是从它左边来,就是从它上边来。所以你从出发点到达一个格子的方法等于到达它上边格子的方法好到达它左边格子的方法的和相同,也就是n+m. 这样,参照上图,你就可以算出从出发点到达每一个格子的方法了。 问题六: “逻辑学家们围成一圈坐着,他们的额头上面画有数字……” 又来一个逻辑学家围成一圈的问题,这次是这样的,三个拥有完美逻辑推理能力的人围成一圈坐在一个房间里,每个人的额头上都画着一个大于0的数字,三个人的数字各不相同,每个人都看得见其他两个人的数字,看不见自己的。 这三个数字的情况是,其中一个数字是其他两个数字的和,已知的情况还有,其中一个逻辑学家的数字是20,一个是30。 游戏组织者从这三个逻辑学家后面走过,并问三个人各自额头上的数字是什么。但第一轮每个逻辑学家都回答他们无法推测自己的数字是什么。游戏组织者只好进行第二轮的发问,这是为什么?你能据此猜出三个逻辑学家的数字吗? 求职者的最佳答案: 结果由第三个逻辑学家的答案而定。他们三个的数字分别是20,30和50。 假设第二个和第三个逻辑学家额头上的数字是20和30,这时候如果第一个逻辑学家的数字是10,那么第二个逻辑学家看到其他两个人一个是10,一个是30,会想:“我要么是20,要么是40.” 第三个逻辑学家看到其他两个人一个是10,一个是20,会想:“我要么是30,要么是10,但我不会是10,因为每个数字都不一样,所以我应该是30.” 这样第三个逻辑学家就会猜出自己的数字是30了,但他没有,第一轮谁也没有准确推测出自己的数字,这说明我们的前提不正确,第一个逻辑学家的数字不是10,那么他只能是50。 问题七: “你面前有一百个灯泡,排成一排……” 一百个灯泡排成一排,第一轮你把他们全都打开亮着,然后第二轮,你每隔一个灯泡关掉一个,这样所有排在偶数的灯泡都被关掉了。 然后第三轮,你每隔两个灯泡,将开着的灯泡关掉,关掉的灯泡打开(也就是说将所有排在3的倍数的灯泡的开关状态改变)。 以此类推,你将所有排在4的倍数的灯泡的开关状态改变,然后将排在5的倍数的灯泡开关状态改变…… 第100轮的时候,还有几盏灯泡亮着? 提示:如果你是第n轮(n大于1小于100),排在n的倍数位置的灯泡的开关状态就发生转变。 反过来,比如第8个灯泡,当你在8的因子轮(即第1,2,4和8轮)的时候,它就会改变开关状态。所以对于第m个灯泡,如果m有奇数个因子,你的开关状态就发生奇数次变化。 求职者的最佳答案: 10盏灯泡亮着,这10盏灯泡排位数都是平方数。 根据提示已经可以看出,这个问题的实质就是找出有多少个灯泡的排位数拥有奇数个因子。每拥有一个因子,到这个因子数的那一轮时,这个灯泡就会被转换开关状态。 比如第1轮,因为所有100个数字都有因数1,所以全部被打开;第2轮,只有那些拥有2这个因子、能被2整除的数字的灯泡转换状态被关掉;第3轮,只有那些拥有3这个因子、能被3整除的数字的灯泡被转换状态。以此类推,如果灯泡排位数拥有奇数个因子,意味着它被打开和关上奇数次,那它就最终还是被打开的状态,如果灯泡排位数拥有偶数个因子,那它最终就是被关上的状态。 比如第1个灯泡有奇数个因子,第2个有偶数个(1,2),第3个有偶数个(1,3)第4个有奇数个(1,2,4),所以 第4个灯泡最后还是亮着的。 最终计算得出,所有排位数为平方数的灯泡最终还是亮着的,因为这些数都拥有奇数个因子,1,4,9,16…… 在100以内,共有10个平方数,分别是1,4,9,16,25,36,49,64,81,100。这10个排位数的灯泡,最终都还是亮着。 问题八: “你有一个立方体,立方体的边长是3……” 这个问题比前面那个从左上格子走到右下格子的问题难,因为那毕竟是个平面问题。如图所示,这次的任务是从立方体的背面左上的小立方体走到完全相对的正面右下小立方体。 你可以往上移,也可以往下移,还可以往前移。You can move toward the front, you can move down, or you can move upward. 问题还是,你共有几种走法? 求职者的最佳答案: 90种,思路是将这个立方体分成“三层”。 上面平面图的那道题的思路就是个最好的提示。你可以将这个立方体分成“三层”,粉红色代表最上面那层,紫色代表中间那层,橘红色代表下面那层。 现在,我们把问题变成了:从左边、右边和上边到达目标小立方体的走法共有多少(如图所示,即到达紫色中间层最右下脚方块以及橘红色最右下脚左边以及上边相邻方块的方法)?假设从起点小立方体到达终点小立方体左边相邻小立方体共有m种方法,到达右边相邻小立方体共有n种方法,到达上边相邻小立方体有r种方法,那我们需要求出来的,就是n+m+r. 按照前面那道平面题的思路和方法,你就可以一点一点计算出来我们的正确答案。

]]>
最近一段时间的我问题记录 2017-05-16T00:00:00+08:00 dfas http://tyctac.github.io/2017/05/最近问题记录 rock 算法

遇到一次两难的境地:使用堆实现rock聚类算法的情况下,在查找删除最大值对应的对象时,可以在常数时间进行操作,但是在以id(对象的某个非入堆比较属性)进行删除或者更新的时候,问题就来了

  1. 如果使用二叉堆实现的话,那么直接使用id为索引的数组存放树节点的引用,可以直接实现删除操作,但是需要重新实现二叉平衡堆,而且删除该树节点的时候需要进行堆调整,而且需要进行平衡调整,这样的话实现起来需要重新考虑
  2. 使用heapq模块,查找对应的id的对象需要的时间复杂度为O(n),使用heapq模块的底层函数进行堆调整复杂度为O(logN)
  3. 之后改进的方案可以从方法一进行改进,即关键就是删除某个节点后进行堆调整的同时能够保持树的平衡
    现在还是使用heapq实现再说吧
]]>
2017-test 2017-05-15T00:00:00+08:00 dfas http://tyctac.github.io/2017/05/schedule 5.15
  1. 使用堆将Q与q[]实现
]]>
2017-test 2017-05-15T00:00:00+08:00 dfas http://tyctac.github.io/2017/05/clustering rock clustering algorithm
  1. 使用python的heapq模块实现,但是堆中删除某个特定id的元素的操作如何调整堆,尝试一下??
]]>
王者荣耀上瘾了怎么班啊啊啊 2017-05-07T00:00:00+08:00 dfas http://tyctac.github.io/2017/05/王者荣耀上瘾了怎么班
  • 好烦好烦,
  • 任务没做完,
  • 稍有放松就想着开一局,
  • 开一局不过瘾又要来一局,
  • 明明知道怎样才能达到自己比较好的状态,
  • 怎么就不能自律一点呢,
  • 明明控制好不晚睡就能解决的吧,
  • 明明第二天早上就会后悔的事,
  • 为什么一遍一遍不知悔改,
  • 这么关键的时候怎么能这样一点一点的掉链子,
  • 心里暗暗下决心,
  • 能有用吗,
  • 自己都不能信任自己,
  • 又怎么能让在乎的人相信自己,
  • 不要当个废物啊,
  • 能不能做到就看你下周的表现了,
  • fuck off..
  • ]]>
    mongodb命令总结 2017-05-01T00:00:00+08:00 dfas http://tyctac.github.io/2017/05/mongodb命令总结 mongodb 命令总结
    class MongoOper:
        def __init__(self):
            self.client = MongoClient()
            self.db = object()
            self.setdb = ('webclasy')
            self.dbauth('zw','lzw')
    
        def setdb(self,dbname):
            self.db = self.client([dbname])
        
        def duauth(self,uname,upasswd):
             self.db.authenticate(uname,upasswd)     
    
    

    使用前先实例化一个MongoOper对象mo,将指针(姑且先这么叫)定位到需要操作的集合上

    point = mo.db[your_collection_name]
    

    之后便在该point上进行各种操作

    1. 插某个记录入
      pont.insert(the_obj)
      
    2. 删除
      point.remove({‘url’:your_url}) 注:’url’是你要删除的字段所满足的条件
    3. 更新
      point.update({‘_id’:your_id},{‘$set’:{‘chi_num’:your_value,’another’:your_value})
    4. 查找最大值
      maxob = point.aggregate([{‘$match’:{}},{‘$group’:{‘_id’:’max’,’max_value’:{‘$max’:’$theKth’}}}]
      返回的maxob,获取结果的方式为
      theKth = 0
      for m in maxob:
       print i
       i += 1
       theKth = m['max_value']
       if theKth == None:
           theKth = 0
       break
      
    ]]>
    python之soket编程 2017-04-28T00:00:00+08:00 dfas http://tyctac.github.io/2017/04/python之soket编程 soket基本原理
    1. 如图所示
      解释:
      服务端
      1. 第一步是创建soket对象。调用socket构造函数。如:
        socket = socket.socket(family,type)
        family参数代表地址家族TODO
        type参数代表套接字类型,可分为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)
      2. 第二步是将socket绑定到指定地址。通过socket对象的bind方法实现:
        socket.bind(address)
        由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式为(host,port)。host代表主机,port代表端口号。如果端口号正在使用,主机不正确或端口已被保留,bind方法将引发socket.error异常
      3. 第三步是使用socket套接字的listen方法接收连接请求。
        socket.listen( backlog)
        backlog指定最多允许多少客户连接到服务器。它的值至少为1.收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
      4. 第四步是服务器套接字通过socket的accept方法等待客户请求一个连接。
        connection,address = socket.accept()
        调用accept方法时,socket会进入‘waiting’状态,客户请求连接时,方法简历连接并返回服务器。accept方法返回一个含有两个元素的元组(connection,address)。第一个元素是新的socket对象,服务器必须通过它与客户通信;第二个元素address是客户的Internet地址。
      5. 第五步是处理阶段,服务器和客户端通过send和recv方法通信,(传输 数据)。服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法在从客户端接收信息。调用recv时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入‘blocked’状态,最后返回一个字符串,用它表示收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区删除(以及自上次调用recv以来,客户可能发送的其他任何数据)。
      6. 传输结束,服务器调用socket的close方法关闭连接。
    2. 客户端
      1. 创建一个socket以连接服务器:socket=socket.socket(family,type)
      2. 使用socket的connect方法连接服务器。e.g.
      3. 处理阶段,客户和服务器将通过send方法和recv方法通信。
      4. 传输结束,客户通过调用socket的close方法关闭连接。
    ]]>
    python正则表达式记录与心得 2017-04-22T00:00:00+08:00 dfas http://tyctac.github.io/2017/04/python正则表达式 这些天在做非法网站的分类,或多或少需要用到一些正则表达式,之前做成人网站分类时也用到了一些,但是只是用了相关接口,自己并没有多少思考,想想有必要稍微系统的记录一下,总结一下.

    从接口方面来说,需要介绍几个Python中re模块的几个函数,以便于之后直接使用接口:

    1. match函数
      格式:re.match(pattern,string,flag=0)
      pattern : 要匹配的正则表达式
      string : 要匹配的字符创
      flags : 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等,e.g. re.M,re.I,如果使用多个标记位,可以使用|连接起来,比如(re.M|re.I)
      示例如下:

    2. re.search方法
      格式: re.search(pattern,string,flag=0)
      pattern : 要匹配的正则表达式
      string : 要匹配的字符串
      flags : 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等
      匹配成功则re.search方法放回一个匹配的对象,否则放回None,使用方式与match中的flags相同
      示例如下:

    3. re.matchre.search的区别:
      re.match只匹配字符串的开始,如果开始不符合正则表达式的规则,则匹配失败,函数返回None;而re.search则匹配整个字符串,直到找到一个匹配

    4. the difference between ‘.+’ and ‘.+?’
      e.g.
      I have the string: “extend cup end table”
      4.1 The pattern e.+d finds: extend cup end
      4.2 The pattern e.+?d finds: extend and end
      4.3 explain:
      Both will match any sequence of one or more characters. The difference is that:
      .+ is greedy and consumes as many characters as it can.
      .+? is reluctant and consumes as few characters as it can.

    ]]>
    字符串匹配 2017-04-17T00:00:00+08:00 dfas http://tyctac.github.io/2017/04/字符串匹配 #### 字符串匹配小结

    1. kmp算法
      private int[] makeNext(char[] arr) {
       int len = arr.length();
       int [] next = new int[len];
          
       next[0] = -1;
       for (int i =0,j=-1;i+1 < len;){
           if(j ==-1 || arr[i] == arr[j]){
               next[i+1] = j+1;
               if(arr[i+1] == arr[j+1]) next[i+1] = next[j+1];
               i++;
               j++;
           }
           if(arr[i] != arr[j]) j = next[j];
       }
       return next;
      }
      

      构建next数组时,初始化next[0]=-1,next[1]=0,-1在此只是用来标记状态,用来表示此时需要将主串中的游标右移,(在主串匹配是如果遇到next[j] = -1,是不是表明主串中存在从串中不存在的字符??),
      next[1] = 0,很好理解,即从串needle[1]失配时,需要用needle[0]进行匹配

    ]]>