letcode-《 无重复字符的最长子串》O(N)解法

问题

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
即:给定一个字符串,找出它所有字串中,最长的,且该字串内无重复字母例如:

abcdef ==》 abcdef
abcabcbbb ==》 abc
dvdf ==》 vdf

解题思路

无重复字串,如果某个字串包含重复字符,那么直接不必考虑;

测试案例:abcabcbbb

1 初始化一个stringBuilder作为工作空间,一个String对象result保存中间步骤结果。

2 从字符串第一个字符开始,判断是否已经存在StringBuilder中;

3 如果不存在,将该判断位字符添加到StringBuilder;

4 如果已存在,判断是否需要导出StringBuilder到result,从重复字符开始裁剪StringBuilder;

  • 例如:result="" StringBuilder=“abc”,下一个待判断的字母是’a’,StringBuilder包含它,导出StringBuilder到 -> result=“abc”,裁剪调字符串"a", 结果:StringBuilder=“bc” (同理,假如判断位是b,StringBuilder将b,以及b以前的字符串"ab"裁剪掉,裁剪结果为:“c” );

这是一个O(N) 时间算法,只需要把字符串s从头到尾遍历一次即可得到答案,个人觉得目前存在比明显的缺陷是StringBuilder的使用,它可能会导致内存消耗。

代码

class Solution {
    public int lengthOfLongestSubstring(String s) {
        String result = "";
        String JUDGE;
        StringBuilder stringBuilder = new StringBuilder();
        for(int i = 0;i < s.length();i++){
            JUDGE = Objects.toString(s.charAt(i));
            if(stringBuilder.indexOf(JUDGE) >= 0){
                if(stringBuilder.length() > result.length())
                    result = stringBuilder.toString();
                stringBuilder.delete(0,stringBuilder.indexOf(JUDGE) + 1);
            }
            stringBuilder.append(s.charAt(i));
        }
        if(stringBuilder.length() > result.length())
            result = stringBuilder.toString();
        return  result.length();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值