3. Longest Substring Without Repeating Characters (Medium)

原题目:
  Given a string, find the length of the longest substring without repeating characters.
  Examples:
  Given “abcabcbb”, the answer is “abc”, which the length is 3.
  Given “bbbbb”, the answer is “b”, with the length of 1.
  Given “pwwkew”, the answer is “wke”, with the length of 3. Note that the
answer must be a substring, “pwke” is a subsequence and not a substring.

题目大意如下:
  给你一个字符串,找到没有重复字符最长子串
  
解题思路:
  从首字符开始,遍历整个字符串,找到所有没有重复字符的的子串,将它们的长度加以比较得到最大的。如果仅仅这样做,时间复杂度为O(n³),所以需要优化。
  我们看这样一个字符串:dedvabc
  第一次循环找到字符串“de”,长度为2,记录下来,目前最长长度为2。
  第二次循环找到字符串“dvabc”,长度为5,记录下来,目前最长长度为5。
  到这里为止,就可以得出答案了,因为后面不管怎么找是找不到比5大的长度的,因为第二次循环已经遍历了剩下的整个字符串。现在只需输出目前最大长度就可以了。
  这样一来时间复杂度就变成了O(n²)。
  
代码如下:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        string newStr ;
        int max = 0 , i = 0 ;
        while(i < s.size()){  //外循环
            for(int j = i ; j < s.size() ; ++j){  //内循环
                //如果没有重复的字符,拿出来构成新的子串
                if(newStr.find(s[j]) == -1) newStr.push_back(s[j]) ; 
                else{  //找到重复的,记录下当前最长长度并清空子串
                    if(max < newStr.size()) max = newStr.size() ;
                    newStr.clear() ;
                    i++ ;
                    break ;
                }
            }
            //若有一次遍历剩下的字符串,只需要比较这个字符串的长度和当前最长长度
            if(max < newStr.size()) return newStr.size() ; 
        }
        return max ;
    }
};

运行结果:
  运行结果
  
知识补充:
  string中的npos是一个很大的数,当作为返回值的时候它的值为-1,作为表示长度的时候它表示直到string的结束(until the end of the string)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值