给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
解法一:
思路:每次顺序读取s的一个元素s[i],用s1存读取的互异的字串;每读取一个元素s[i],用它逆序遍历s1,如果发现s1中某一元素s1[j]和s[i]相等,则从j+1直到s1尾部截取s1并把s[i]加到s1后面。
class Solution { public: int lengthOfLongestSubstring(string s) { if(s == "") return 0; string s1,s2;//s2用来重置s1 s1 = s1 + s[0];//s1用来存互异的字串 int len = 1; for(int i = 1; i < s.length(); ++i){ bool flag = 1;//判断下面的for循环是否完整执行 for(int j = s1.length()-1; j >= 0; --j){ if(s[i] == s1[j]){ flag = 0; if(s[i] == s[i-1]){//如果要判断的s[i]和它的上一位相等,则清空当前的s1 s1=s2+s[i]; len = max(len,int(s1.length()));//每次改变s1的时候更新len break; } s1 = s1.substr(j+1) + s[i]; len = max(len,int(s1.length()));//每次改变s1的时候更新len break; } } if(flag) s1 = s1 + s[i];//for循环完整执行则在s1后加上s[i] len = max(len,int(s1.length()));//每次改变s1的时候更新len } return len; } };
解法二:
利用hash表的思想,建立一个256的数组来存每个字符对应的值。
class Solution { public: int lengthOfLongestSubstring(string s) { int a[256] = {0}; int l = 0,n = 0;//l表示无重复字串的长度,n表示无重复字串的左边界 for(int i = 0;i < s.size();++i){ if(a[s[i]] == 0 || a[s[i]] < n){ l = max(l,i-n+1); }else{ n = a[s[i]]; } a[s[i]] = i+1; } return l; } };