原题:
思路:
- 列举出来所有的合理的子串,初始的索引设为i,结束的索引设为j,设置双层循环,i:0到n-1;j:i+1到n;
- 设置一个set,将每次检查后不重复的字符add进去,如果重复的字符,就返回false。
代码一:
import java.util.HashSet;
import java.util.Set;
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();//n代表字符串的长度
int ans = 0;
for (int i = 0; i < n; i++)//双层循环嵌套
for (int j = i + 1; j <= n; j++)
if (allUnique(s, i, j))
ans = Math.max(ans, j - i);
return ans;
}
public boolean allUnique(String s, int start, int end) {
Set<Character> set = new HashSet<>();
for (int i = start; i < end; i++) {
Character ch = s.charAt(i);//返回i的索引的char值
if (set.contains(ch))
return false;
set.add(ch);
}
return true;
}
}
public class LongestSubstring {
public static void main(String[] args) {
Solution answer=new Solution();
System.out.print("The length is "+answer.lengthOfLongestSubstring("ancdafk"));
}
}
运行结果:
The length is 6
代码二:
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();//取得字符串的长度
Set<Character> set = new HashSet<>();
int ans = 0, i = 0, j = 0;
while (i < n && j < n) {
// try to extend the range [i, j]
if (!set.contains(s.charAt(j))){//当集合set不包含j索引对应的字符时
set.add(s.charAt(j++));//就把该字符加入到set中并使j加1
ans = Math.max(ans, j - i);
}
else {
set.remove(s.charAt(i++));//否则(就是set中包涵了j索引对应的字符),就把最前面的字符(肯定是重复的字符)去掉
}
}
return ans;
}
}
public class LongestSubstring {
public static void main(String[] args) {
Solution answer=new Solution();
System.out.print("The length is "+answer.lengthOfLongestSubstring("ancdafk"));
}
}