字符串算法——最长子串(无重复元素)

问题:给定一个字符串,找出最长的无重复元素的子串
例如:
“bbbbbb”的子串为”b”
“abcabccd”的子串为”abc”
两种思路,一种是从头开始依次比较,例如:
字符串为:”abcabccd”,从第一个字符元素”a”开始,直到”abca”发现出现重复元素,则从第二个字符元素”b”开始重复上述操作,比较得到的长度,

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int len =s.length();//字符串长度
        if(len==0)return 0;
        int maxlen = 1;//存储子串长度
        int i=0;
        while(true){
            boolean flag[] = new boolean[256];//标记是否出现重复元素
            int point = i+1;
            flag [s.charAt(i)]= true;
            while(point<len && !flag[s.charAt(point)]){//判断该字符元素是否出现过
                flag[s.charAt(point)]=true;
                if(maxlen<point-i+1){//判断是否找到更大的子串长度
                    maxlen = point-i+1;
                }
                point++;
            }
            i++;
            //判断是否跳出循环
            if(i>=len){
                break;
            }
        }
            return maxlen;
    }
}

另一种思路是跳跃式比较,例如:
字符串为”abcbaccd”,一开始从第一个字符元素开始比较,到”abcb”发现出现重复字符元素”b”,这时候不从第二个字符元素”b”开始比较,因为比较后发现不会比前一个子串更长,这里从出现重复字符元素前一个该字符元素后一位开始比较,即从第三个字符元素”c”开始,降低时间复杂度。

class Solution {
    public int lengthOfLongestSubstring(String s) {
    int length = s.length();//字符串长度
        if(length ==0){
            return 0;
        }
        int start = 0;
        int i = start;//每次比较的起始位置
        int max = 1;//存储最长子串长度
        while(i<length){
            boolean flag[] = new boolean[256];//标记是否出现重复字符元素
            for(;i<length;i++){
                if(!flag[s.charAt(i)]){
                    flag[s.charAt(i)] = true;
                    if(max<i-start+1){
                        max = i-start+1;
                    }
                }else{
                    start = s.indexOf(s.charAt(i),start)+1;//下次比较的起始点
                    i=start;
                    break;
                }
            }
        }
        return max;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值