Leetcode 算法题之3.无重复字符的最长子串

题目如下所示:

基本思路为:

先构建一个字符串ans,值为s的第一个字符。对传入的字符串s,从第二个开始,取出其中的每一个字符,用for循环对ans中的值与该字符进行判断,若ans中不含有,则填入ans;含有则意味着要改变ans,具体改变为删除ans所含有该字符的前面部分,这样才可以填入后面部分,可以理解为滑动窗口。

用一个int类型的变量max表示最大长度,初始值为0,每当要删除ans的一部分时,意味着ans为目前所遍历到的s中一个不重复的子串,用max与当前ans的长度进行比较,取较大值。

当s都遍历完后,所得的ans不一定是最大长度子串,还要与max进行比较,具体代码如下:

public class Solution {
    public int LengthOfLongestSubstring(string s) {
    if(s.Length==0)return 0;
    int max=0;
    string ans;
    ans=s.Substring(0,1);
    for(int i=1;i<s.Length;i++){
        string c=s.Substring(i,1);
        if (ans.Contains(c)){
            max=max>ans.Length?max:ans.Length;
            ans=ans.Remove(0,ans.IndexOf(c)+1);
            ans=string. Concat(ans,c);
        }else{
            ans=string. Concat(ans,c);
        }
    }
     max=max>ans.Length?max:ans.Length;
     return max;
    }
}

这种遍历时间复杂度为O(n),效率较低

 看了题解后,发现还可以用哈希集合,时间复杂度为O(1)。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值