LeetCode Longest Substring Without Repeating Characters
Problem
My Answer in C++
A.O(n^2) => TLE
class Solution {
public:
int lengthOfLongestSubstring(string s)
};
int hashmap[505];
bool hashmapjudge(string s, int l, int r) { // using hashmap judge whether the string has repeat character or not
bool ans = true;
memset(hashmap, 0, sizeof(hashmap));
for (int i = l; i <= r; i++) {
int index = int(s[i]);
if (hashmap[index] == 1) {
ans = false; break;
}
else hashmap[index] = 1;
}
return ans;
}
int Solution::lengthOfLongestSubstring(string s) {
int ans = 0;
if (s.length() == 1) return 1;
for (int i = 0; i < s.length(); i++) {
for (int j = 0; j < s.length(); j++) {
if (hashmapjudge(s, i, j)) {
if (j-i+1 > ans) ans = j-i+1;
}
}
}
return ans;
}
B.O(n) => Accept
class Solution {
public:
int lengthOfLongestSubstring(string s)
};
int hashmap[505]; // using hashmap record the character's pla
int Solution::lengthOfLongestSubstring(string s) {
int ans = 0, start = 0;
memset(hashmap, -1, sizeof(hashmap));
if (s.length() == 0) return 0;
if (s.length() == 1) return 1;
for (int i = 0; i < s.length(); i++) {
int index = int(s[i]);
// refresh start
if (hashmap[index] != -1 && hashmap[index]+1 > start)
start = hashmap[index]+1;
if (i-start > ans) ans = i-start;
// refresh character's pla in hashmap(using ASCII index)
hashmap[index] = i;
}
return ans+1;
}
Details
Better Solutions
Feelings and Review
总的来说,本题难度一般(废话)。
1.首先要做的是理解题意,题目求所有满足要求的特殊字符串中最长字符串的长度,这个字符串里面的字符都是不重复的。
2.本题实现起来较为容易,但是需要冷静,暴力解决不了问题,O(n^2)的算法(即上文中的A解法)不能过最后一个样例(非常长),因此需要考虑算法的优化。
3.我所考虑的一种算法是,遍历一遍字符串,一个是根据由散列(index是字符的ASCII码)将字符串中的每一个字符出现的位置记录下来并不断更新;另一个是维护特殊字符串的首指针(start):当出现重复的字符时,将首指针移动到这个重复字符上一次出现位置的下一位(比如重复字符'a'上一次出现的位置是3,start就移动到4),但是前提是首指针不能倒退!(考虑样例:abssba)。
最后,在这个遍历的过程中,不断判断和更新answer即可。时间复杂度O(n)。
2017/2/3
To improve is to change, to be perfect is to change often.