题目:
Given a string, find the length of the longest substring without repeating characters.
Examples:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
Subscribe to see which companies asked this question.
——————————————————————————————————————————————————————————————————————————
没有什么要求,那就用最简单的for循环吧~
代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<char> st;
if(s.size()==1){
return 1;
}
for(int i = 0; i < s.size(); i++){
vector<char> inst;
inst.push_back(s[i]);
for(int j = i+1; j < s.size();j++){
int flag = 0;
for(int k = 0; k < inst.size(); k++){
if(inst[k] == s[j]){
flag = 1;
break;
}
}
if(flag == 0){
inst.push_back(s[j]);
if(inst.size() > st.size()){
st = inst;
}
}
else{
if(inst.size() > st.size()){
st = inst;
}
break;
}
}
}
return st.size();
}
};
for里套for。但是这样写中间的某些细节也容易搞错。哎。
上传后一看速度排名只战胜了百分之七点几。。。额。
意识到这样做是不够的。想其他方法也想不出来,就参考一下吧。
别人的思路:用map存每个数字对应的下标。长度就是两个数下标之差+1,也就是这个数与前一个数的前一位的(start)下标之差。
每次找到重复的之后,start变为这个重复的以前的数字。
厉害了
class Solution {
public:
int lengthOfLongestSubstring(string s) {
map<char, int> charMap;
int start = -1;
int maxLen = 0;
for (int i = 0; i < s.size(); i++) {
if (charMap.count(s[i]) != 0) {
start = max(start, charMap[s[i]]);
}
charMap[s[i]] = i;
maxLen = max(maxLen, i-start);
}
return maxLen;
}
};
得自习想想这个代码的思想。