3 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
- 1.首先想到的还是暴力法,时间复杂度是O(n²),但空间复杂度是O(1)。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
string resstr;
int res=0;
if(s==""){
return 0;
}
if(s.length()==1){
return 1;
}
for(int i=0;i<s.size()-1;i++){
resstr="";
resstr.push_back(s[i]);
int j=i+1;
while(j<s.size() && resstr.find(s[j])==s.npos){//find函数返回s.npos表示字符串中没有对应字符
resstr.push_back(s[j]);
j++;
}
if(resstr.size()>res){
res=resstr.size();
}
}
return res;
}
};
通过时间:
- 可以看到暴力法解决效率是很低的,所以就想想有没有办法优化,首先想到的是减少循环次数,利用双指针来实现
class Solution {
public:
int lengthOfLongestSubstring(string s) {
set <char> assset;
int res = 0, left = 0, right = 0;
while (right < s.size()) {
if (assset.find(s[right]) == assset.end()) {//find函数返回尾端时表示set中没有对应字符
assset.insert(s[right++]);
if(assset.size()>res){//set中存的就是每一个子串。
res=assset.size();
}
}
else {//如果set中存在字符则从坐指针位置一直删除。
assset.erase(s[left++]);
}
}
return res;
}
};
通过时间:
- 用哈希表也尝试,竟然发现用的内存也不多。代码和上面差不多,用的unordered_map数据结构,在其中存的是每个字符和其遍历到的最靠右的位置。
通过时间: