问题
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
"pwwkew" 输出: 3
因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意, 答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路
贪心,每一次子问题的求解都是当前的最优解,单个子问题能决定大问题。
而动态规划,则不能决定,只能影响。
解答
错误
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int start=0;
int i=0,j=1;
int maxl=0;
if(s.length()==0) return 0;
if(s.length()==1) return 1;
else{
for(j=1;j<=s.length()&&start<s.length();j++){
for(i=0;i<j;i++){
if(s[i]==s[j]){
if(i-start+1
>maxl){
maxl=i-start+1;
}
start=i+1;
j=j+1;
i=start;
}
else
j=j+1;
if(j==s.length()) break;
}
}
return maxl;
}}
};
正解(贪心)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
const int ASCII_MAX = 255;
int last[ASCII_MAX];
int start = 0;
fill(last, last + ASCII_MAX, -1);
int max_len = 0;
for (int i = 0; i < s.size(); i++) {
if (last[s[i]] >= start) {
max_len = max(i - start, max_len);
start = last[s[i]] + 1;
}
last[s[i]] = i;
}
return max((int)s.size() - start, max_len); // "abcd"
}
};
正解(移动窗口)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int size,i=0,j,k,max=0;
size = s.size();
for(j = 0;j<size;j++){
for(k = i;k<j;k++)
if(s[k]==s[j]){
i = k+1;
break;
}
if(j-i+1 > max)
max = j-i+1;
}
return max;
}
};