[LeetCode] Longest Substring Without Repeating Characters

来源:互联网 发布:淘宝血滴子是什么梗 编辑:程序博客网 时间:2024/05/10 03:58

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.

问题描述:给定一个字符串,找到这个字符串中没有重复字符的最长子串的长度。比如,给定字符串abcabcbb,最长的不重复的字符串就是abc,长度为3,给定字符串为bbbbb,只有一个字符b,长度为1。

最简单的想法就是,找到所有的没有重复字符的子串,得到最大的长度。用一个hash表存储当前正在判断的字符串的不重复的字符,用两个迭代器得到一个区间,当第二个迭代器的字符不在hash表中,说明该字符是不重复的字符,那么就递增第二个迭代器,并将该字符加入到hash表中,否则,就获取hash表的长度,这就是当前的不重复字符串的长度,与已经得到的最长的长度进行比较,然后清空hash表,递增第一个迭代器,并将第二个迭代器置为第一个迭代器。

class Solution {public:    int lengthOfLongestSubstring(string s) {        if(s.empty())return 0;set<char> hash;unsigned long n = 0;string::iterator start = s.begin();string::iterator iter = s.begin();while(start != s.end()) {if(iter != s.end() && hash.find(*iter) == hash.end()) {hash.insert(*iter);++iter;}else {if(hash.size() > n) {n = hash.size();}if(iter == s.end())    break;hash.clear();++start;iter = start;}}return n;    }};

上面的判断过程中,如果找到一个重复的字符,就将区间的起始位置下移一个位置,如果能够利用已经判断的结果就好了。其实,如果找到一个重复字符,就可以直接将起始位置置为当前区间中的那个重复字符的下一个位置。

class Solution {public:    int lengthOfLongestSubstring(string s) {        if(s.empty())return 0;unsigned long n = 0;string::iterator start = s.begin();string::iterator iter = s.begin(), find_iter;while(start != s.end()) {if(iter != s.end() && (find_iter = find(start, iter, *iter)) == iter) {++iter;}else {if(iter - start > n) {n = iter - start;}if(iter == s.end())break;start = find_iter + 1;iter = start;}}return n;    }};


0 0
原创粉丝点击