《从头再来》剑指offer.48 最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
采用双指针和哈希表来解决这道题。最初始的时候,两个指针都指向字符串的首位,然后移动右指针来不断扩大非重复字串的长度,然后将右指针指向的值加入到哈希表中,如果在加入的时候判断到哈希表中某个值重复了(>1),则重复的移动左指针,直到右指针指向的值不重复。每次移动右指针,都更新一下最长子字符串的长度。
class Solution { public: int lengthOfLongestSubstring(string s) { if(s.size() <= 1) return s.size(); unordered_map<char, int> map; int i = 0, j = 0;//左右指针 int result = 0; while(j < s.size()){ map[s[j]]++; while(map[s[j]] > 1){ map[s[i]]--; ++i; } result = max(result, j-i+1); j++; } return result; } };
class Solution { public: int lengthOfLongestSubstring(string s) { if(s.size() <= 1) return s.size(); unordered_map<char, int> map;//第一个参数为存入的字符,第二个参数为字符存入的次数 int i = 0, j = 0; int result = 1;//此时至少为1 for(j = 0; j < s.size(); ++j){//右指针移动 map[s[j]]++; while(map[s[j]] > 1){ //要循环的对i进行递增,直到哈希表中的子串不重复,所以要用while,而不是只用if判断,使得i只移动一步 map[s[i]]--; i++; } result = max(result, j-i+1); } return result; } };
《从头再来》

浙公网安备 33010602011771号