Longest Substring Without Repeating Characters
2015-06-01 09:20
127 查看
Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without
repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
开始拿到这道题的时候,开始没什么思路。后来在纸上画了一画,才发现了算法,其实也就用到了一个flag+哈希表。从左往右逐个字符遍历字符串,开始flag设置为-1。每遍历一个字符,若与左边已遍历过的字符没有冲突,则将当前字符的索引cur存入哈希表中。哈希函数f(key)=key,key为字符的ASCII码。若第一次发生冲突,则算出这次遍历得出的最长子串的长度(cur
- flag -1),与此前的len比较判断是否需要更新len,并在哈希表中将当前字符的索引cur覆盖前面这个字符的索引rep,再令flag = rep。但此时还要注意两种特殊情况:一种是遍历完全部字符串都没有发生冲突,则直接返回字符串的长度;第二种是若最后一个字符在当前这次遍历中(即flag置位后)没有发生冲突,则此次遍历得出的最长子串的长度为(cur - flag)。
Runtime:4ms
![](https://img-blog.csdn.net/20150602232643024)
小结:
1.注意哈希表的使用:1)哈希函数;2)哈希表的大小,一定要能覆盖所有的f(key)值。
2.注意题目中的特殊情况与边界情况。
3.想不动时动动手,光动手不好好想也不行。学会抽象和归纳,用机器的角度思考问题。
repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
开始拿到这道题的时候,开始没什么思路。后来在纸上画了一画,才发现了算法,其实也就用到了一个flag+哈希表。从左往右逐个字符遍历字符串,开始flag设置为-1。每遍历一个字符,若与左边已遍历过的字符没有冲突,则将当前字符的索引cur存入哈希表中。哈希函数f(key)=key,key为字符的ASCII码。若第一次发生冲突,则算出这次遍历得出的最长子串的长度(cur
- flag -1),与此前的len比较判断是否需要更新len,并在哈希表中将当前字符的索引cur覆盖前面这个字符的索引rep,再令flag = rep。但此时还要注意两种特殊情况:一种是遍历完全部字符串都没有发生冲突,则直接返回字符串的长度;第二种是若最后一个字符在当前这次遍历中(即flag置位后)没有发生冲突,则此次遍历得出的最长子串的长度为(cur - flag)。
Runtime:4ms
#define N 150 int searchHashTable(int * hashTable,char c) { int index = c; //hash function if( hashTable[index] >= 0 ) return hashTable[index]; else return -1; } int lengthOfLongestSubstring(char* s) { int len = 0,flag = -1,r = 0,strLen,cur; strLen = strlen(s); int hashTable ,rep; for( cur = 0 ; cur < N ; cur++) hashTable[cur] = -1; for( cur = 0 ; cur < strLen ; cur++ ) { rep = searchHashTable(hashTable,s[cur]); if( rep == -1 || rep <= flag ) { hashTable[ s[cur] ] = cur; //fill in character's index of s string. if( cur == strLen - 1 ) //boder situation:the last character does not collide. { len = len >= ( cur - flag ) ? len : ( cur - flag ); } } else { r = 1; len = len >= ( cur - flag -1 ) ? len : ( cur - flag -1 ); hashTable[ s[cur] ] = cur; //use the bigger index to cover the smaller one. flag = rep; } } if( r ) return len; else <span style="white-space:pre"> </span>//special situation:no collision occurs. return strLen; }
小结:
1.注意哈希表的使用:1)哈希函数;2)哈希表的大小,一定要能覆盖所有的f(key)值。
2.注意题目中的特殊情况与边界情况。
3.想不动时动动手,光动手不好好想也不行。学会抽象和归纳,用机器的角度思考问题。
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解
- LeetCode [Day 5] Longest Palindromic Substring 题解
- LeetCode [Day 6] ZigZag Conversion 题解
- LeetCode 2: Add Two Numbers (JAVA)
- LeetCode 1: Two Sum (JAVA)