第三天--leedcode第三题

        Given a string, find the length of the longest substring without repeating characters. 

        这是leedcode第三题的描述,简单来说就是给定一个字符串,找出这个字符串中最大的非重复子串的位置。如给定字符串“asdaqwesaqq”,那么他的非重复最大子串是“daqwes”   答案应该是6.

       一般来说,如果题目给出最大,最小,最。。。。   之类的词,第一时间应该想到贪心法。当然,贪心法不一定决定能解,但是第一时间应该想到它。贪心法不是一个具体的算法,而是一种思想,先找出最符合题意的一种解,然后利用贪心的思想一步一步来求得最终解(个人愚见,我是个菜鸟,希望有大神能指出我的错误)。

       碰到字符串求子串的问题时,无外乎利用辅助指针,或者辅助子串,map工具等来求解。而利用辅助指针是我碰到最多的。

       具体到这道题,我们第一步首先将字符串转换为char型的数组,然后构造两个辅助指针,left和right,刚开始两个指针都指向数组的开头部分;这时,我们得到一个char型的数组{asdaqwesaqq}和两个都指向第一个a的指针;

       第二步,然后right指针向后移,直到right指针指向的char等于left(这是关键,因为要找无重复字符的最大子串),right后移过程中,将遇到的字符装入map中。这时,在我们的字符数组中,left=0,right=3,map中有{a,s,d},right和left中间为无重复子串,长度为3,记max = 3;

      第三步,右移left,并逐步删除中间碰到的字符,直到map中没有right所指的字符;(在本字符串中是右移一位即可,但是如果right所指位置是d,那么left就需要右移三位了);

      然后,重复二三步即可,不同的是当right右移完毕,记录right-left   并与max比较,令max取最大值。(这就是贪心,每次都取最大的);

     附上源码。

猜你喜欢

转载自709002341.iteye.com/blog/2251151