输出最长不重复子串

遇到过好几次这种类似的题了,只记得第一次是在阿里巴巴的笔试题中遇到的。
想了好久好久才想出来,下次再让我写我觉得我又写不出来了。

package test;

public class StrTest {
    public static String longStr(String str) {
        int maxLength=0;
        char[] chs=str.toCharArray();
        String resStr="";//最长不重复串
        String resStr2="";//第二个最长不重复串,用作临时存储
        boolean flag=true;//如果找到了最长串之后遇到重复字符最长串终止拼接,将flag置为false。然后继续找新的最长串
        for(int i=0;i<str.length();i++) {
            maxLength=resStr.length();
            int k=resStr.indexOf(chs[i]+"");
            if(k>=0) {//说明当前字符之前出现过
                flag=false;
                /*找到重复字符在当前已查找过的串中最后一次出现的位置,例如:qqqqq  j的值为i-1 d=1*/
                int j=str.substring(0,i).lastIndexOf(chs[i]);
                int d=i-j;//当前不重复子串的长度
//              System.out.println("i="+i+"j="+j+"d="+d);
                if(d>=maxLength) {//else已经找到最长串,flag为false。如果d>=maxLength从新的位置开始截取
                    maxLength=d;
                    resStr+=chs[i];
                    resStr=resStr.substring(k+1, resStr.length());

                    flag=true;
                }

            }
            else if(flag) {//当前字符本来就没出现过,或者重复后截取之后变为不重复的了,那么可以继续拼接
                resStr+=chs[i];
            }
          /*如果找到了当前最大的串,那么应该先暂时把它记录下来,
           * 然后继续向之后找最大的串,和之前最大的串做比较,如果长度比之前的还要大就将最长串的值进行更新*/
            else {
                resStr2=longStr(str.substring(i));
//              System.out.println("str.substring(i)"+str.substring(i)+"----------resStr2"+resStr2);
                if(resStr2.length()>resStr.length()) {
                    resStr=resStr2;
                    i=i+resStr.length();//
                }
            }
        }

        return resStr;
    }

    public static void main(String[] args) {
        String str="aabcdfffghzdhkopsll";
        System.out.println(longStr(str));//zdhkopsl
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值