大家好,穿插刷题日记,继续leetcode,中等难度,字符串。题目要求如下:
思路:
构建一个字符串t用来保存子串,但这个t是不管是否有相同字符只写入不删除的,t会越来越长直到变成完整的字符串s,因此我们定义一个point表示当前不重复子串的起头位置,每当读入s的一个新的字符,我们就判断其与point和t的最后一个字符之间的字符是否相等。第二点是构造一个vector temp来计算每一个不重复的子字符串的长度。
为什么t只写入不删除呢,每次都clean然后从头作比较不是很方便么,但是不删除而是用point记录当前比较子串的起头位置是因为新读入的s的字符串可能与当前子串中的某一字符相同,我们就要从相同的这个字符的后一个字符开始重新计算下一个子串,因此这个相同点的位置总归是要记录的,如果把t的前面删除,point就会一会加一会减,很乱,不如不删除,可以保证point是持续增加的。
最后用max_element函数计算出vector中最大的元素输出即可。
代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.empty()){
return 0;
}
vector<int> temp;
string t;
t += s[0];
temp.push_back(1);
int num = 0;
int point = 0;
int flag = 0;
int len = s.size();
for(int i = 1;i < len;i++){
int len_str = t.size();
for(int j = point;j < len_str;j++){
if(s[i] == s[j]){
flag = 1;
point = j;
break;
}
}
if(flag){
t += s[i];
int len_temp = len_str - point;
point++;
temp.push_back(len_temp);
num++;
flag = 0;
}
else{
temp[num]++;
t += s[i];
}
}
auto result = max_element(temp.begin(), temp.end());
return *result;
}
};
我们下期见!