题目:
本文给出了:没有重复字符的最长子串
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定
"abcabcbb"
,没有重复字符的最长子串是"abc"
,那么长度就是3.
给定"bbbbb"
,最长的子串就是"b"
,长度是1
给定"pwwkew"
,最长子串是"wke"
,长度是3,请注意答案必须是一个子串,"pwke"
是子序列而不是子串。
思路:
差不多约等于小白的我拿到这个题其实不太知道怎么弄呢,研究了半个小时也没研究出啥有用的东西呀。但是脑子里灵光一闪想到学校学过的数据结构的队列好像正好用在这个题中呢〜
然后就在纸上画画就出了自己的一点想法了:遇到不同的字母就入队列,遇到相同的字母就记录下上一个相同字母的位置,同时记录此时队列里的元素和长度,再将之前那个相同字母和它前面的元素全部出队列,如此反复就可以得到每次行成的只含有不同元素队列中的元素和长度啦〜比较每次队列的长度就能够得到字符的最长值啦〜
代码:
struct SqQueue{
char data[100000];
int front;//队首指针
int rear;//队尾指针
}SqQueue;
int enQueue(struct SqQueue *qu,char x){
qu->rear=qu->rear+1;
qu->data[qu->rear]=x;
return 1;
} //入队列
int deQueue(struct SqQueue *qu,int y){
qu->front=y+1;
return j;
}//将第y个之前的元素出队列
int lengthOfLongestSubstring(char* s) {
int i,j,len,max;
int longth=0;
len=strlen(s);
if(len==0)
return 0;
struct SqQueue *sq=(struct SqQueue *)malloc(sizeof(struct SqQueue));//创建队列
sq->front=0;
sq->rear=0;
sq->data[0]=s[0];
max=0;
for(i=1;i<len;i++)
{
for(j=sq->front;j<=sq->rear;j++)
{
if(s[i]==sq->data[j])
{
longth=deQueue(sq,j);
if(longth>max)
{
max=longth;
}
break;
}
}
enQueue(sq,s[i]);
}
longth=deQueue(sq,sq->rear);
if(longth>max)
max=longth;
return max;
}