package jvm;
import java.util.HashMap;
import java.util.Map;
public class NoRepeatString {
/**
* 003-Longest Substring Without Repeating Characters(最长非重复子字符串)
*
* @param s
* 输入字符串
* @return 最大非重复子串长度
*/
// 可以处理所有的UTF-8字符
public int lengthOfLongestSubstring2(String s) {
// 字符串输入不合法
if (s == null) {
return 0;
}
// 当前处理的开始位置
int start = 0;
// 记录到的最大非重复子串长度
int result = 0;
String finalRe="";
int max=0;
// 访问标记,记录最新一次访问的字符和位置
Map<Character, Integer> map = new HashMap<Character, Integer>(
s.length());
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i); // 如果字符已经出现过(在标记开位置算起),就重新标记start
if (map.containsKey(ch) && map.get(ch) >= start) {
start = map.get(ch) + 1;
} // 如果没有出现过就求最大的非重复子串的长度
else {
int tm=i - start + 1;
if(tm>result){//继续增加
max=i;
}
result = Math.max(result,tm);
}
// 更新访问记录
map.put(ch, i);
}
System.out.println(s.substring(max-result+1,max+1));
return result;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
NoRepeatString lnp = new NoRepeatString();
String str = "abca123deab";
int result;
result = lnp.lengthOfLongestSubstring2(str);
System.out.println("result=" + result);
}
}