给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
解题思路:
我只会用笨方法,暴力求解。
从字符串的第0个字符开始查找,每次查找都用一个字符数组来存放出现的不同字符,查找过程中遍历该字符数组,如果新字符与之前存放的字符都不同,就继续存放,如果相同就终止,并比较此时字符数组的下标(不同字符的个数)与无重复子串的最大长度max(初始化为0),若前者更大,则将max更新,否则不变,之后从字符串的第1个字符开始查找……重复执行上述操作,直到s字符终止。
代码如下:
#define N 50000
int lengthOfLongestSubstring(char * s)
{
int i,len,k,m,max=0,n;
len=strlen(s);
char notes[N];
for(i=0;i<len;i++)
{
k=i;n=0;
while(s[k]!='\0')
{
if(k==i)
{
notes[n++]=s[k];
}
else
{
for(m=0;m<n;m++)
{
if(s[k]==notes[m])
break;
}
if(m<n)
{
break;
}
else
{
notes[n++]=s[k];
}
}
k++;
}
if(n>max)
max=n;
if(max>=len-i)
break;
}
return max;
}