渣渣写的代码这次编译都通过不了。。。
但是根据代码执行窗口来说输出结果是对的,然后思路也比较清晰
我写的代码。。。
核心思路:
- 使用三个循环,第一个循环控制子串的起始位置,然后第二个循环开始完成子串尾元素的移动,第三个循环开始遍历子串检查尾元素与前面任意一个元素是否重合
- 设置变量存储,一个用于循环内存储另一个用于存储每个循环比较之后得出的比较大的结果。这里是循环内常用的思路。
思路其实就是这么简单,但我写的代码实现起来问题百出。动不动 stack over flow,与使用迭代器初始化一个string对象时的尾元素选定有关。
然后还有就是条件的设置比较困难,然后一些逻辑上的错误没有被发现debug找了好半天!
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int flag=0,temp,state;
for(auto it=s.begin();it!=s.end();it++){
for(auto it2=it;it2!=s.end();it2++){
string st(it,it2);
temp=1;
for(auto a:st){
if(a==*it2) {state=a;break;}
++temp;
}
flag=flag<temp?temp:flag;
if(state==*it2)break;
}
}
return flag;
}
};
这个代码运行结果之类都正确,但是因为编译器的问题网页验证通不过…
在it2的地方有一个state的限制,这里的作用就是避免浪费时间继续向下循环
别人写的代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int size,i=0,j,k,max=0;
size=s.size();
//this turn is to visit all elements
for(j=0;j<size;j++){
for(k=i;k<j;k++)//the first turn condition is false
if(s[k]==s[j]){
i=k+1;
break;
}
if(j-i+1>max)
max=j-i+1;
}
return max;
}
};
嗯…我太难了,别人写的代码第一遍一般不怎么能看得懂我太难了我太菜了
这个代码的思路和我的完全不一样,但毋庸置疑还是别人写的代码香,代码还是别人写的香。
思路:
- 设置一个变量来遍历字符串的每一个元素
- 查找遍历字符串元素之前与其相等的元素然后保存此值
- 经过反复比较得出答案。
这个实现起来少了一重循环,我的思路首先找到首末然后那末尾遍历前面的元素,这个的方法是把末尾确定然后拿前面的元素进行查找。(循环所以前面的元素一定没有重合,如果有重复的i=k+1
就是为了跳到重复元素的下一位去)