Leetcode- Longest Substring Without Repeating Characters

96 篇文章 0 订阅

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.


第一种方法:用 flags数组记录每个字符是否出现过,从第一个字符开始循环,用int second 记录搜索开始位置,看字符str[ i ] 是出现过,如果出现过则判断最大长度,同时要初始化lags数组的状态,初始化后并且从second  到 i 直接的状态也要重新设置,再进入轮循环。注意最后一次。

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      

using namespace std;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
                int i=0;
                int flags[1024]={0};//其实可能不全是0
                memset(flags,0,sizeof(flags));
                while(i
      
      
       < (i-second) ) ? reserv="second" , : max; memset(flags,0,sizeof(flags)); second="s.find(s[i],second)+1;" int j="second;" while(j<="i)//初始化从second到现在的flags状态" flags[s[j]]="1;" j++; i++;>
       max? reserv = second, (s.length()-second):max;//最后一次
                return max;
    }
        int reserv,first,second,max;//second 搜索无重复字串的开始位置,reserv记录最大字串的开始位置
        Solution():reserv(0),first(0),second(0),max(0){};
};

int main()
{
        string str="cdd";
        Solution s;
        s.lengthOfLongestSubstring(str);
        cout<
       
       
         <<":"< 
        
          < 
          
         
       
      
      
     
     
    
    
   
   

第二种方法:从左往右扫描,当遇到重复字母时,以上一个重复字母的index+1,作为新的搜索起始位置,直到最后一个字母,复杂度是O(n)

用flags记录每个元素最后出现的位置,用int second 记录搜索开始位置,如果遇到元素重复出现了且出现位置在大于等于second 就是真的重复,如果出现位置在second前面那就没有重复这次搜索的字串

转自:https://github.com/soulmachine/leetcode

#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       

using namespace std;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
                int i=0;
                int flags[256]={-1};//并没有把数组所有元素置为零!!!!
                memset(flags,-1,sizeof(flags));
                //cout<
       
       
        
        <
        
        
          = second ) //有等于!!,出现的位置在second前面没有问题,这次是从second开始的 { max = ( max < (i- second) ) ? reserv = second , (i- second) : max; second= flags[s[i]]+1; } flags[s[i]]=i;//记录最后一次的位置!!! i++; } max= (s.length()-second)>max? reserv = second, (s.length()-second):max;//最后一次 return max; } int reserv,first,second,max; Solution():reserv(0),first(0),second(0),max(0){}; }; int main() { string str="c"; Solution s; s.lengthOfLongestSubstring(str); cout< 
         
           <<":"< 
          
            < 
            
           
          
        
       
       
      
      
     
     
    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值