Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
给一个数组,求最长的字符不重复的子字符串的长度。
菜鸟一般都这么写:两个循环,内层循环j++一直到遇到重复的字符,跳到外层循环,外层循环再++。
C:
int lengthOfLongestSubstring(char* s) {
int maxlength = 0,isrepeat = 0,temp;
int i,j,k,length = strlen(s);
for(i = 0; i < length; i++){
temp = 1;
isrepeat = 0; //重复标志,遇到重复就置1
j = i + 1;
while(j < length && isrepeat == 0){
k = i;
while(k < j){
if(s[k] == s[j]){
isrepeat = 1;
break;
} else{
k++;
}
}//这个while用来查找重复值
if(k == j){
j++;
temp++;
}
}
maxlength = temp > maxlength ? temp : maxlength;
}
return maxlength;
}
java:
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
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);
else break;
}
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);
if (set.contains(ch)) return false;
set.add(ch);
}
return true;
}
}
模板:只用一个while循环和一个容器
java:
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.add(s.charAt(j++));
ans = Math.max(ans, j - i);
}
else {
set.remove(s.charAt(i++));
}
}
return ans;
}