您的位置:首页 > 其它

刷leetcode第三题-求不重复字符的子字符串最大长度

2017-12-21 00:00 543 查看
趁下班时间,花了两个晚上,自己硬刚,终于刚出来了,先说思路后上代码。

用一个例子来说明吧:比方有字符串 abcdabac

我的做法就是,弄两个指针分别指向当前目标子字符串的头和尾,初始化的时候他们都指向字符串的头部。循环的时候,固定头指针,尾指针开始向前移动,如果尾指针的值在头尾之间的字符中有出现过,那么找出这个已经出现过的字符的位置,让头指针到这个位置上来:

0. *head = ‘a’;*tail = 'a';

1. *head = ‘a’;*tail = 'b';

2. *head = ‘a’;*tail = 'c';

3. *head = ‘a’;*tail = 'd';

4. *head = ‘a’;*tail = 'a';

此时一定要注意了,头尾内容相同了,要搞出某种事情才行!

我们的目的是要求长度,此时就应该计算一下头尾的距离,拿到长度了。

我的思路就是让头指针向前移动,尾指针继续运行;

5.*head = ‘b’;*tail = 'b';

如法炮制。代码如下

#include <stdio.h>
#include <string.h>
int max(int a, int b)
{
return a>b?a:b;
}

int store_in_tmp(char a,int* tmp)
{
int to_int = (int)a;
int index = to_int/32;
int move = to_int % 32;
int trans = 1<<move;

if(tmp[index]&trans){
return 0;
}
return tmp[index] = tmp[index]|trans;
}

int remove_from_tmp(char a,int* tmp)
{
int to_int = (int)a;
int index = to_int/32;
int move = to_int % 32;
int trans = 1<<move;

if(tmp[index]&trans){
return tmp[index] = tmp[index]&(~trans);
}
return 0;
}

int lengthOfLongestSubstring(char* s)
{
if(!*s){
return 0;
}

int max_len = 0;
int tmp[4];
char* head = s;
char* tail = s;
memset(tmp,0,4);
while(*tail){
if(store_in_tmp(*tail,tmp)){
max_len = max(tail-head,max_len);
tail++;
}else{
while(*tail^*head){
remove_from_tmp(*head,tmp);
head++;
}
++head;
remove_from_tmp(*tail,tmp);
}
}

return max_len+1;
}

int main()
{
char* s = "$adasdasxx";
char c = '$';
printf("max len is %d \n",get_len(s));
/*
int tmp[4];
memset(tmp,0,4);
int ret = store_in_tmp(c,tmp);
printf("ret is: %d tmp is %d\n",ret,tmp[1]);
ret = remove_from_tmp(c,tmp);
printf("ret is: %d tmp is %d\n",ret,tmp[1]);
*/
return 0;
}

这里面几个关键的地方,一是总体上面的指针思路,二就是存储已经走过的字符串,我开了一个大小为4的int数组,因为字符串里面的字符最多是128种,那么我就拿128位来存储他们也就是4个int,通过位运算进行出和入。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐