leetcode 第三题Longest Substring Without Repeating Characters

来源:互联网 发布:插画网络课程 编辑:程序博客网 时间:2024/04/30 08:32

Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.


不重复的最长子字符串。


思路:

对于一个字符串,重复即是遇到与之前一样的字符。

我们考虑当前最长子字符串初始位置在某一处,比如在字符为a的一处,当经过axxxxxx后又遇到a。

此时原先的初始位置最大值已经不会继续增长了,因为遇到重复的a。


这时候我们设置最长子字符串初始位置为a的后一位。(即抛弃了之前的a)

此时遇到的重复a在这个新的字符串里只出现了一次,字符串的长度又可以拓展了。

历遍字符串,当当前字符出现过的时候,子串开始位置+1,否则更新locs数组中的hash值为当前位置。

class Solution {public:        int lengthOfLongestSubstring(string s) {        int location[256];        int length=s.size();        memset(location,-1,sizeof(location));        int loc=-1;    //还未开始遍历字符串s 当前位置为-1(由于数组从0开始)        int max=0;        for(int i=0;i<length;i++)  //i当前字符串末尾位置        {            if(location[s[i]]>loc)  //说明之前已经有这个字符s[i]了                loc=location[s[i]];  // 当前位置设为location[i],从location[i]后一个字符算起。(为啥不加1与当前位置为-1同理)            if(i-loc>max)                max=i-loc;        //每次遇到新字符都更新max值。            location[s[i]]=i;        }        return max;    }};




为什么是不重复的最长字符串呢?

首先location数组会保存每一个字符最新出现的位置。

最长字符串前提是不重复,当每次遍历一个字符时候,我们会首先检测这个字符之前出过的位置是在哪里。如果这个字符之前出现的位置比loc(即当前检测到的不重复的最长字符串的起始位置)大,也就是说现在这个最长字符串中已经存在了这个字符,再次遇到这个字符的话不重复的要求就得把loc位置更新到该字符之前出现的位置后一位才行。

而我们每次循环一个字符,都会对max值进行更新,所以我们可以保证在遇到重复的字符前max值是当前遍历的字符串中最大值,而遇到重复字符串后若是不更新loc值,max则已经没有机会继续增大。(要求是不重复。)

所以我们更新loc值后是为了继续探索还有没有可能得到更大的字符串。

直到遍历结束。

0 0
原创粉丝点击