【算法】java语言求不定长字符串的最长子串和长度

public class interview6 {
    /**
     * 用java写一个最长子串,有一个字符串,不定长,比如abcdbafedcabcmonabcd,
     * 写一个方法要找出给定字符串的最长子串,最长子串是连续的不重复的字符串,返回长度(7)
     */
    @Test
    public void test(){
        String str="abcdbafedcabcmonabcd";
        int left=0;
        int maxlength=0;
        Map<String,Integer> substrs=new HashMap<>();
        StringBuilder sb=new StringBuilder();

        Map<Character,Integer> map=new HashMap<>();
        for(int right=0;right<str.length();right++){
            char x=str.charAt(right);
            if(map.containsKey(x)){
                left=Math.max(left,map.get(x)+1);
                String s = sb.toString();
                substrs.put(s,maxlength);
                sb=new StringBuilder(s.substring(s.indexOf(x)+1));
            }
            map.put(x,right);
            sb.append(x);
            maxlength=Math.max(maxlength,right+1-left);
        }
        substrs.put(sb.toString(),maxlength);

        System.out.println("最大不重复子串长度为:"+maxlength);
        Set<String> keySet = substrs.keySet();
        Iterator iterator=keySet.iterator();
        while (iterator.hasNext()){
            Object key = iterator.next();
            int value=substrs.get(key);
            System.out.println(key+"--->"+value);
        }
    }
}
//结果:
//        最大不重复子串长度为:7
//        cdb--->4
//        cdbafe--->6
//        monabcd--->7
//        fedcab--->6
//        abcmon--->6
//        bafed--->6
//        bcmona--->6
//        cmonab--->6
//        monabc--->6
//        bafedc--->6
//        abcd--->4
//        fedca--->6