子串与子序列
- 子串(substring)——在字符串中是连续的
- 子序列(subsequence)——在字符串中可以不连续,也可以连续
字符串的最长不重复子串
第一次是这样做的时间复杂度为O(n2),就是穷举啦,当然是要超时滴¬_¬
int lengthOfLongestSubstring(string s) {
if(s == "") return 0;
int max_len = 1;
for(int i = 0; i < s.length(); i++){
for(int j = 0; j < s.length(); j++){
if(isUnique(s, i, j) && j - i + 1 > max_len){
max_len = j - i + 1;
}
}
}
return max_len;
}
bool isUnique(string s, int start, int end){
int flag = 1;
for(int i = start; i <= end - 1; i++){
for(int j = i + 1; j <= end; j++){
if(s[i] == s[j] && i != j){
flag = 0;
break;
}
}
}
if(flag){
return true;
}else{
return false;
}
}
然后改进了下,i和j都只把这个string从开始到结束遍历了一遍,时间复杂度是O(n)
int lengthOfLongestSubstring(string s) {
int n = s.length(), i = 0, j = 0;
bool exist[256] = {false};
int max_len = 0;
while(j < n){
if(exist[s[j]]){
max_len = max(max_len, j - i);
while(s[i] != s[j]){
exist[s[i]] = false;
i++;
}
i++;
j++;
}else{
exist[s[j]] = true;
j++;
}
}
max_len = max(max_len, n - i);
return max_len;
}
字符串最长不重复子序列
字符串中的不重复序列
int lengthOfLongestSubstring(string s) {
int max_len = 0, flag;
for(int i = 0; i < s.length(); i++){
flag = 1;
for(int j = 0; j < i; j++){
if(s[i] == s[j]){
flag = 0;
break;
}
}
if(flag){
max_len++;
}
}
return max_len;
}