解法如下
public static void main(String[] args) {
// TODO Auto-generated method stub
String s="abcdefaaccddellkdfhnm";
findLongestSubString(s);
}<div>
</div>
private static void findLongestSubString(String s) {
// TODO Auto-generated method stub
int len=s.length();
if(len>0)
{
int max=0;
Map<Character,Integer> map=new HashMap<Character,Integer>();//存放字符串的位置
int lenthAt[]=new int[len];
lenthAt[0]=1;
map.put(s.charAt(0), 0);
for(int i=1;i<len;i++)
{
if(map.containsKey(s.charAt(i)))
{
//System.out.println((lenthAt[i-1]+1)+"ddddd"+map.get(s.charAt(i)));
//lengAt[i]存放以字符string.charAt(i)结尾的最长子字符串的长度
lenthAt[i]=Math.min(lenthAt[i-1]+1,i-map.get(s.charAt(i)));
System.out.println("lenthAt[i]"+lenthAt[i]);
}else
{
lenthAt[i]=lenthAt[i-1]+1;
}
max=Math.max(lenthAt[i], max);//<span style="font-family: monospace; white-space: pre; background-color: rgb(240, 240, 240);">max的目的就是确定这个最长,因为最开始可能找到的子串比以后找到的子串短,所以用max比较 </span>
System.out.println("max="+max);
map.put(s.charAt(i), i);
}
for(Entry<Character,Integer>e:map.entrySet())
{
System.out.println(e.getKey()+" "+e.getValue());
}
//System.out.println();
for(int i=0;i<len;i++)
{
if(max==lenthAt[i])
{
//System.out.println(lenthAt[i]);
System.out.println(i+" len"+len);
System.out.println(s.substring(i+1-max, i+1));
}
}
}
}