1、题目描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
2、自己的解题思路
暴力求解:变了字符串,计算其不含重复字符的长度,若相等,则从第二个再与前对比,以此类推
结果:超时!
int lengthOfLongestSubstring(char* s) {
int ans=0;
int len=strlen(s);
char str[len];
int dex1=0,dex2=0;
int myMax=ans;
for(int i=0;i<len;i++)
{
if(ans==0)//第一次相同的时候或者第一个开始
{
dex1=i;
dex2=0;
str[i]=s[i];
ans++;
}
else
{
dex2=ans;
dex1=i;
for(int j=0;j<ans;j++)//比较下一位是否与前面的字符相同
{
if(s[dex1]==str[dex2-1])//若出现相同的话,则跳出该循环,答案不成立
{
break;
}
dex2--;
}
if(dex2==0)//若能已知比到第一个数,则说明都不相同,所以答案+1
{
ans++;
}
else
{
i=dex1-1-ans;
if(myMax<ans)
myMax=ans;
ans=0;
}
}
}
return myMax;
}
3、改进思路
思路:第一次计算的不同的字符串长度已知,当出现下一个字符跟前面某一个字符相同,则记录该位置,从这个位置下一个开始计数。
int lengthOfLongestSubstring(char* s) {
int ans=0;
int len=strlen(s);
char str[len];
int dex1=0,dex2=0;
int myMax=ans;
for(int i=0;i<len;i++)
{
if(ans==0)//第一次相同的时候或者第一个开始
{
dex1=i;
dex2=0;
str[i]=s[i];
ans++;
}
else
{
dex2=ans;
dex1=i;
for(int j=0;j<ans;j++)//比较下一位是否与前面的字符相同
{
if(s[dex1]==str[dex2-1])//若出现相同的话,则跳出该循环,答案不成立
{
dex1=dex1-dex2;
break;
}
dex2--;
}
if(dex2==0)//若能已知比到第一个数,则说明都不相同,所以答案+1
{
ans++;
}
else
{
i=dex1;
if(myMax<ans)
myMax=ans;
ans=0;
}
}
}
return myMax;
}
能跑了,但是我至今不懂为什么是错误的
4、题目解答
作者:我自横刀向天笑
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/solutions/1192065/wu-zhong-fu-zi-fu-de-zui-chang-zi-chuan-u22kb/
来源:力扣(LeetCode)
关键点有:
1:使用2个指针来索引字符串
2:hash思想-即值和位置之间的关系。
3:保存最大的无重复字符串的长度即可
时间复杂度是:O(n)
空间复杂度是 O(n)
代码:
int lengthOfLongestSubstring(char* s) {
//类似于hash的思想
//滑动窗口维护
int left=0;
int right=0;
int max=0;
int i,j;
int len=strlen(s);
int haveSamechar=0;
for(i=0;i<len;i++)
{
if(left<=right)
{
//检测是否出现重复
//循环遍历整个数组 left->right
haveSamechar=0;
for(j=left;j<right;j++)
{
if(s[j]==s[right])
{
haveSamechar=1;
break;
}
}
if(haveSamechar)
{
//指向下一个
left=j+1;
}
}
//统计最大的间距
max=max<(right-left+1)?(right-left+1):max;
right++;
}
return max;
}