最长不重复子字符串

题:给定一个字符串,找到最长子字符串的长度而不重复字符。
例1:

输入:“abcabcbb”
输出:3
说明:答案是"abc",长度为3。

一开始看到题目很迷,很久没想出来,然后网上看了一下别人的思路,然后自己整理一下就过了。

题解:
定义一个int数组g 为了存字符的下标,给数组初始化为-1;(因为字符就那么几个对吧 我完全可以用数组来存,也可以用hashmap)
定义一个三个变量 left,len,max
遍历此字符串
判断该字符是否之前出现过,没有出现过就直接len++对吧,如果出现过,还得看他之前出现的位置,如果在left之前那也可以len++,反之 我们就得将现有的len和max比较了,我们的max一直存的都是最大值,所以每次出现重复字符的时候,len都会改变,所有改变的时候我们就可以进行比较,然后left 赋值成重复字符串的下表,然后len也要重新改变,哎直接丢代码吧

int[] g = new int[128];
        for(int i=0;i<g.length;i++)
        {
        	g[i]=-1;
        }
        int left = 0;
        int len = 0;
        int max = 0;
        char ch;
        for (int i = 0; i < s.length(); i++) {
			   ch=s.charAt(i);
			   if(g[ch]==-1 || g[ch]<left)
               {
                   len++;
                   
               }else{
                  if(len>max)
                       max = len;
                   left = g[ch];
                   len = i-left;
               }
             
            g[ch]=i;
		}
         if(len>max)
            max = len;
     return max;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值