求最长素子串的长度

本来在leetcode里面搜的是哈系表相关算法练习,把这个题做完后,感觉没用到相关知识[哭笑一波 ?]

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

简单说一下这个题,他想要求的是字符串中无重复字符的字串的最大长度,最初用暴力解法来做的,时间复杂度为O(n^3)结果是超时,最后就选用滑动窗口机制来解决,时间复杂度为O(n^2).

#include <iostream>
#include<string>
#include<vector>
#include<iterator>
using namespace std;
class Solution{
public:
    int isContain(char ch ,vector<char>ss){
        for(int i=0;i<(int)ss.size()-1;i++){
            if(ss[i]==ch){
                return i;
            }
        }
        return -1;
    }
    //使最左端窗口向右滑动
    void remove(int st,vector<char>&ss){        
        vector<char>::iterator iter ;
        int i =0;
        //删除容器中下标为st及之前的所有元素
        for(iter=ss.begin();iter!=ss.end();){
            ss.erase(iter);   
            if(i==st)break;
            i++;
        }
    }

    int lengthOfLongestSubstring(string s) {
            int i=0,j;
            j=i+1;
            int ans=1;
            //如果是空串,返回0
            if(s==""){
                return 0;
            }
            //如果是空格串,返回1
            if(s==" "){
                return 1;
            }
            int st;
            int l;
            //相当于一个窗口
            vector<char>ss;
            //开始降低一个元素放进容器
            ss.push_back(s[i]);
            int len = (int)s.length();
            while(j<len){
                //遍历字符串,并将遍历的字符放进容器,相当于使最右端窗口向右滑动
                ss.push_back(s[j]);
                //计算容器的容量
                l = (int)ss.size();
                //要是容器中前面的元素有和最后一个元素相同的字符
                if((st=isContain(s[j],ss))!=-1){
                   l = (int)ss.size()-1;
                   //就将这个字符在容器中的位置找到即st记录
                    remove(st,ss);
                }
                ans = ans>l?ans:l;
                j++;
            }
            return ans;
    }
};
int main()

{
    Solution ss ;
    string a ;
    //注意,应该用getline接收一行的输入,因为输入是空格时,cin不会识别
    getline(cin,a);
    int n =ss.lengthOfLongestSubstring(a);
    cout<<n<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值