题目链接:题目链接
找到最长不重复子串,使用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; } };
时间: 2024-11-06 07:08:53