标签:
题目链接:题目链接
找到最长不重复子串,使用hash方法来做是极好的!遍历string,找到一个字符,然后会判断这个字符是不是已经在当前的这个子串中,这个使用hash方法,因为可见字符最多256个,那么使用hash[256]就可以!初始化为-1,保存的是相应的字符在string中的位置。如果遇到在前面存在的字符,那么需要将这个子串的start位置移动到已经存在的位置后面一位,然后继续遍历,直到遍历结束。
具体看下面的代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int max_len = 0, start = 0, i = 0, n = s.length(), len = 0;
int hash_elem[256];
memset(hash_elem, -1, sizeof(hash_elem));
while (i < n){
// hash_elem[s[i]] < 0说明:是新的字符,之前没有出现过
// hash_elem[s[i]] < start说明:字符出现过,但是已经作废
// 例如: abcdb
// 我们遍历到abcd,然后发现b重复,那么后面其实是从c开始,
// 但是a由于b的影响也就被作废了,但是这个时候a在hash_elem中
// 的下标还是0,但是小于start,所以相当于也是合法的字符
//
if (hash_elem[s[i]] < 0 || hash_elem[s[i]] < start)
++len;
else{
max_len = max_len > len ? max_len : len;
// 注意吧前面的字符减掉
//
len -= hash_elem[s[i]] - start;
// 新的位置从重复字符的位置后面一位开始
//
start = hash_elem[s[i]] + 1;
}
hash_elem[s[i]] = i;
++i;
}
return max_len > len ? max_len : len;
}
};
第三题:Longest Substring Without Repeating Characters
标签:
原文地址:http://blog.csdn.net/shanshanpt/article/details/43672039