题干描述:给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度
示例:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其
长度为 3。
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
个人解决代码与运行耗费时间与空间:
个人思路是创建一个256大小的char辅助数组。再从目标字符串的第一个字符开始遍历,如果这个字符第一次出现,就把他的ASCII码值对应的辅助数组位置里的元素改成1,如果某个新遍历的字符发现他位置里的元素为1的话,就代表这个字符出现过,再从下一个字符开始遍历。期间记录下来最长字串长度max。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()==0) return 0;
int res=1;
for(int i=0;i<s.size();i++){
char temp[256]={'0'}; // 初始化数组
int max=0;
int j=i;
while(temp[(int)s[j]]==NULL){
temp[(int)s[j]]='0'; // 若字符已经出现过,则对应辅助数组中那个位置改为0
j++;
max++;
}
if(res<max) res=max;
}
return res;
}
};
代码运行时间与内存消耗
个人疑问:
其实本来这个执行通过的代码并不是我想的那个代码。本人原本想要执行的代码如下
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()==0) return 0;
int res=1;
for(int i=0;i<s.size();i++){
char temp[256]={'0'};
for(int k=0;k<256;k++){
temp[k]='0';
} // 将数组内所有元素初值置为'0'
int max=0;
int j=i;
while(temp[(int)s[j]]=='0'){
temp[(int)s[j]]='1'; // 某字符第一次出现时,将对应位置改为'1'
j++;
max++;
}
if(res<max) res=max;
}
return res;
}
};
但这段代码每次运行都会出bug,leetcode给出的错误是
只可惜本人实在才疏学浅,不知道如何解决,若有大神愿意指点一二,本人必定洗耳恭听