标签:
LeetCode OJ 3: Given a string, find the length of the longest substring without repeating characters.
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
Given "bbbbb"
, the answer is "b"
, with the length of 1.
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
思路1:本题的任务是得到没有重复字符的最长子串的长度。我的解法是使用i和j两个指针进行搜索,i代表候选的最长子串的开头,j代表候选的最长子串的结尾。搜索过程中,如果字符j重复出现,则从重复字符第一次出现的位置开始重新搜索,直到遍历所有的可能性。
时间复杂度:O(N²)
int lengthOfLongestSubstring(string s) {
int maxLen, i, j, k, curLen;
int char_int_arr[256];
maxLen = i = j = 0;
while(i < s.length() && j < s.length())
{
for(j = 0; j < 256; j++)
char_int_arr[j] = -1;
for(k = j = i; j < s.length(); j++)
{
if(char_int_arr[s[j]] != -1)
{
i = char_int_arr[s[j]] + 1;
break;
}
else
char_int_arr[s[j]] = j;
}
curLen = j - k;
if(maxLen < curLen)
maxLen = curLen;
}
return maxLen;
}
思路2:仔细观察可以发现,解法1在子串搜索的过程中做了很多重复的工作。检索到重复字符后,两个重复字符之间的子串不会存在其他重复字符,所以这一段区间可以不用再次遍历。
时间复杂度:O(N)
int lengthOfLongestSubstring(string s) {
int n = s.length();
int i = 0, j = 0;
int maxLen = 0;
bool exist[256] = { false };
while (j < n) {
if (exist[s[j]]) {
maxLen = max(maxLen, j-i);
while (s[i] != s[j]) {
exist[s[i]] = false;
i++;
}
i++;
j++;
} else {
exist[s[j]] = true;
j++;
}
}
maxLen = max(maxLen, n-i);
return maxLen;
}
Longest Substring Without Repeating Characters
标签:
原文地址:http://www.cnblogs.com/keep-simple/p/5664612.html