刷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';
如法炮制。代码如下
这里面几个关键的地方,一是总体上面的指针思路,二就是存储已经走过的字符串,我开了一个大小为4的int数组,因为字符串里面的字符最多是128种,那么我就拿128位来存储他们也就是4个int,通过位运算进行出和入。
用一个例子来说明吧:比方有字符串 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,通过位运算进行出和入。
相关文章推荐
- leetcode——Longest Substring Without Repeating Characters 求链表中无重复字符的最大字串长度(AC)
- LeetCode: 3_Longest Substring Without Repeating Characters | 求没有重复字符的最长子串的长度 | Medium
- leetcode第三题:求给定字符串中最长无重复子串的长度
- 没有重复字符的子串的最大长度
- LeetCode系列字符串操作(一)ZigZag输出,寻找最大不重复字串长度。
- leetcode_[Python/C++]_3_Longest Substring Without Repeating Characters(不重复子串最大长度)
- java中求一个字符创的最大不重复长度
- 从字符串S中找出不包含重复字符的最大连续子字符串长度
- LeetCode 3. Longest Substring Without Repeating Characters--不包含重复字符的最长子串长度
- [leetcode]获取字符串中字符不重复的最长子串的长度
- 02_对N个长度最长可达到1000的数进行排序、对给定的一个字符串,找出有重复的字符,并给出其位置、输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序
- Longest Substring Without Repeating Characters计算字符串中不含有重复字符的连续字符串的最大长度
- 字符串中不重复连续字符子串的长度最大值
- 找出字符串中最大子串的长度(要求子串中的字符不重复)
- 【leetcode】第3题:求最长不重复(字符不重复)的子串的长度
- leetcode 3-最长无重复字符的子字符串
- leetcode-java.T003_LongestSubstringWithoutRepeatingCharacters 给定一个字符串,找字符中的最大非重复子串
- LeetCode 题解 3. Longest Substring Without Repeating Characters(最长不含重复字符的子字符串)
- lc#3求字符串中不包含重复字符的最大长度子串
- 【LeetCode】寻找最大长度不重复子串