子串與子序列
- 子串(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;
}