LeeCode--Longest Substring Without Repeating Characters

对于这个题目,我想到了和two sum一样用map来做,可是做出来超过了时间限制,下面把代码贴上来:

class Solution {
public:
	int lengthOfLongestSubstring(string s) {
       map<char,int>res;
 	  int i=0,max=0,n=0;
 	  char *p,*q,*pb;
 	  pb= p=q=&s[0];
 	 while(p<(pb+s.size())&&q<(pb+s.size())){		   
		  if (!res.count(*q))
 		  {  
 			  res.insert(pair<char,int>(*q,i++));
 			   q++;
 			  n= q-p;
 		  }
 		  else{
 			  		  
 			  p++; 
 			  if(max>(pb+s.size()-p))
 			  {
 				  return max;
 			  }
 			  q=p;
 			  res.clear();
 			  i=0;
 		  }
 		  
 		  if (max<n) max =n;
 	 }
 	
 	 return max;
}
};
然后想到直接用哈希表来做,以字符为键,以字符所在字符串的位置为值:

public:
	int lengthOfLongestSubstring(string s) {
     int pos[512];
	 
	 int max=0,min=0;
	 for (int i =0;i<512;i++)
	 {
		 pos[i]= -1;
	 }
	 for (int i = 0;i<s.size();i++)
	 {
		 if (pos[s[i]] == -1)
		 {
			 pos[s[i]] = i;
		 }
		 else{
			 if (i-min>max)
			 {
				 max = i-min;
			 }
			 for (int j =0;j<512;j++)
			 {
				 if (pos[j]!=-1&&pos[j]<pos[s[i]])
				 {
					 pos[j] = -1;
				 }
			 }
          min = pos[s[i]]+1;
		  pos[s[i]] = i;
	      }
	 }
		 if (s.size()-min>max)
		 {
			 max = s.size()-min;
		 }


	 return max;
	}
};
重点是下面代码的理解:如果从min开始一直都是没有重复的字符,那么就不会进入else语句

                if (s.size()-min>max)
		 {
			 max = s.size()-min;
		 }


 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值