题目描述:给定一个字符串,找出其中不含有重复字符的 最长子串 的长度
例1:"abcabcbb" -》 3
例2:"bbbbb" -》1
例3:"pwwkew" -》3
解法一、暴力枚举
思路:给定两个下标left和right,表示一个子串,对于每个子串,都将right元素和right之前的元素进行比较,判断是否有重复元素,若都不重复,right向右移动一步
abcabcbb
ab ->判断s[1],s[0]是否相等
abc->分别判断s[2]和s[1],s[0]是否相等
abca->判断后有相同元素,left向右移动一动,right回到left的下一个元素
public int lengthOfLongestSubstring(String s) {
public int lengthOfLongestSubstring(String s) {
/**
*遍历字符串,走到新的字符,则将当前字符与之前的字符比较是否相等
*/
if (s == null || s.length() == 0) {
return 0;
}
int max = 1; //最长长度
int currLen = 1; //当前长度
int left = 0;//子串开始位置
//每一次走到一个新的字符,就将当前字符与当前子串比较,查看是否有相同字符,若都不重复就currLen+1,有重复就从相同字符的下一个字符开始新的一个字符,并重置currLen,tmpStart
int right = 1;
while (true) {
if (right >= s.length()) {
break;
}
boolean isEqueal = false;
for (int j = right - 1; j >= left; j--) {
if (s.charAt(j) == s.charAt(right)) {
isEqueal = true;
break;
}
}
if (!isEqueal) {
currLen += 1;
right++;
} else {
left += 1;
right = left + 1;
currLen = 1;
}
if (currLen > max) {
max = currLen;
}
}
return max;
}
}
解法二、
从上面的枚举中能看出来,在start->right这个子串,如果start->right+1才出现重复,那么证明start->right这个子串是不重复的,即start右移一步,start+1->right的子串是不重复的。所以right不需要再从start+1开始判断重复
以 (a)bcabcbb开始的最长字符串为 (abc)abcbb;
以 a(b)cabcbb 开始的最长字符串为 a(bca)bcbb;
以 ab(c)abcbb 开始的最长字符串为 ab(cab)cbb;
以 abc(a)bcbb开始的最长字符串为 abc(abc)bb;
以 abca(b)cbb 开始的最长字符串为 abca(bc)bb;
以 abcab(c)bb 开始的最长字符串为 abcab(cb)b;
以 abcabc(b)b 开始的最长字符串为 {abcabc(b)b;
以 abcabcb(b) 开始的最长字符串为abcabcb(b)。
public int lengthOfLongestSubstring(String s) {
/**
* 遍历字符串,start->right之间不重复,但是start->right+1出现重复,可以确定start+1->right之间是不重复的
* 用HashSet存储每个不重复的字符
* 1,对于null,0,1三种特殊情况分别做处理
* 2,遍历字符串
* 2.1,在left和right不相等的时候,set.add(left),避免重复add
* 2.2,保证right不越界,同时当set中不包含right号字符时,set.add(right) && right右移
* 2.3,包含的时候,重新赋值maxCount,移除left,同时left右移
*/
if (s == null || s.length() == 0) {
return 0;
}
if (s.length() == 1) {
return 1;
}
int left = 0;
int right = 1;
int maxCount = 0;
HashSet<Character> set = new HashSet<Character>();
for (int i = 0; i < s.length(); i++) {
if(left != right){
set.add(s.charAt(left));
}
while (right < s.length() && !set.contains(s.charAt(right))) {
set.add(s.charAt(right));
right++;
}
maxCount = maxCount > set.size() ? maxCount : set.size();
set.remove(s.charAt(left));
left++;
}
return maxCount;
}
1570

被折叠的 条评论
为什么被折叠?



