/**
* 无重复最长子串
* 转:输出一个字符串的最大无重复字符的子串
*
* @return
*/
public int getLongestSubStr(String strs) {
Map<Character,Integer> map = new HashMap<>();
int max=0,start=0;
int n=strs.length();
for (int i = 0; i < n; i++) {
char ch =strs.charAt(i);
if (map.containsKey(ch)){
start =Math.max(map.get(ch)+1,start);
}
max=Math.max(max,i-start+1);
map.put(ch,i);
}
return max;
}
public int getLongestSubStr(String strs) {
// 字符串长度
int n = strs.length();
// 定义两个指针
int rk = 0;
int ans = 0;
// 记录每个字符是否出现过
Set<Character> set = new HashSet<>();
for (int i = 0; i < n; i++) {
if (i != 0) {
// 左指针向右移动一格,移除一个字符
set.remove(strs.charAt(i - 1));
}
while (rk < n && !set.contains(strs.charAt(rk))) {
set.add(strs.charAt(rk++));
// rk++;
}
// 第i到第rk是一个最长的无重复子串
ans = Math.max(ans, rk - i);
System.out.println("set is : "+set);
}
return ans;
}
上面只是把最大无重复子串的长度输出了,如果我想也获取到这个最大无重复子串呢?
public Map<List<Set>,Integer> getLongestSubStr(String strs) {
// 字符串长度
int n = strs.length();
// 定义两个指针
int rk = 0;
int ans = 0;
// 将每个无重复子串存到数组中
List<Set> setList=new ArrayList<>();
// 记录每个字符是否出现过
Set<Character> set = new HashSet<>();
for (int i = 0; i < n; i++) {
if (i != 0) {
// 左指针向右移动一格,移除一个字符
set.remove(strs.charAt(i - 1));
}
while (rk < n && !set.contains(strs.charAt(rk))) {
set.add(strs.charAt(rk++));
// rk++;
}
// 第i到第rk是一个最长的无重复子串
ans = Math.max(ans, rk - i);
System.out.println("set is : "+set);
Set<Character> newSet=new HashSet<>();
set.forEach(x->{
newSet.add(x);
});
setList.add(newSet);
}
Map<List<Set>, Integer> map=new HashMap<>();
map.put(setList,ans);
return map;
}