中等_384_最长无重复字符的子串(6)

来源:互联网 发布:淘宝主图psd模版 编辑:程序博客网 时间:2024/06/17 07:05



class Solution {public:    /**     * @param s: a string     * @return: an integer      */    int lengthOfLongestSubstring(string s) {        // write your code here        int m[256] = {0}, res = 0, left = 0;        for (int i = 0; i < s.size(); ++i) {            if (m[s[i]] == 0 || m[s[i]] < left) {//判断数组s中的第一个元素的哈希值是否为0                res = max(res, i - left + 1);        } else {            left = m[s[i]];        }        m[s[i]] = i + 1;//数组s中的第一个元素的哈希值赋值为i+1      }    return res;   }};

注:m[s[i]] = i + 1,当进入下一个循环时,若新取到的字符与上一个字符相同时,s[i] = s[i+1],则m[s[i]] = m[s[i+1]] = i+1不等于0,此时不进入if,进入else,更新left的位置。



后备知识:

1.a[]表示访问数组元素,比如int a[10]定义了长度为10的整型数组,标号从0-9,a[3]就表示下标为3的元素(第四个)

2.a[100]={0}是什么意思?

一维数组a的第一个元素为0,a[100]指数组a最多有100个元素

3.==与=的区别

=:是赋值,使值为=后的数。
==:是比较,是与==后的数进行比较,相等为真,如果不相等为假。


问题描述:

给定一个字符串,请找出其中无重复字符的最长子字符串。


样例

例如,在"abcabcbb"中,其无重复字符的最长子字符串是"abc",其长度为 3

对于,"bbbbb",其无重复字符的最长子字符串为"b",长度为1


解题思路:

建立一个256位大小的整型数组来代替哈希表,这样做的原因是ASCII表共能表示256个字符,所以可以记录所有字符,然后我们需要定义两个变量res和left,其中res用来记录最长无重复子串的长度,left指向该无重复子串左边的起始位置,然后我们遍历整个字符串,对于每一个遍历到的字符,如果哈希表中该字符串对应的值为0,说明没有遇到过该字符,则此时计算最长无重复子串,i - left +1,其中i是最长无重复子串最右边的位置,left是最左边的位置,还有一种情况也需要计算最长无重复子串,就是当哈希表中的值小于left,这是由于此时出现过重复的字符,left的位置更新了,如果又遇到了新的字符,就要重新计算最长无重复子串。最后每次都要在哈希表中将当前字符对应的值赋值为i+1。

这里解释下程序中那个if条件语句中为啥要有个m[s[i]] < left,我们用一个例子来说明,当输入字符串为"abbca"的时候,当i=4时,也就是即将要开始遍历最后一个字母a时,此时哈希表表中a对应1,b对应3,c对应4,left为2,即当前最长的子字符串的左边界为第二个b的位置,而第一个a已经不在当前最长的字符串的范围内了,那么对于i=4这个新进来的a,应该要加入结果中,而此时未被更新的哈希表中a为1,不是0,如果不判断它和left的关系的话,就无法更新结果,那么答案就会少一位,所以需要加m[s[i]] < left。

具体参见原博:http://www.cnblogs.com/grandyang/p/4480780.html


原创粉丝点击