您的位置:首页 > 其它

[LeetCode]Longest Substring Without Repeating Characters

2015-02-01 18:25 369 查看
Q: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.

最简单最暴力啊QAQ结果就是Time Limit Exceeded...一开始的想法是,第一,因为要求的子串要最长,所以我们取子串的时候从大到小取,对给定的字符串S[0,1,...,N-1]取子串时从S[0,1,2...,N-2]开始,然后是S[1,2,...,N-1],S[0,1,2,...,N-3],S[1,2,...,N-2],S[2,3,..,N-1]。以此类推;第二,判断所取字符串是否在原字符串中出现不止一次,我用的是string类型的find和rfind函数,分别从前端和后端查找所取子串,若查找的位置相同,则说明该子串只出现一次。

另外,对于形如"abbbbbc"的字符串,取出sub时判断一下sub的每个字符是否相等,若相等则返回1。

贴上暴力的code:

class Solution {
public:
	bool sameLetter(string s){
		char c = s[0];
		for (int i = 1; i < s.length(); i++){
			if (s[i] != c)
				return false;
		}
		return true;
	}

	int lengthOfLongestSubstring(string s) {
		string sub;
		int index1 = 0;
		int index2 = 0;
		for (int i = s.length() - 1; i >= 1; i--){
			for (int j = 0; j < s.length(); j++){
				if (i + j <= s.length()){
					index1 = 0;
					index2 = 0;
					sub = s.substr(j, i);
					index1 = s.find(sub);
					index2 = s.rfind(sub);
					if (index1 != index2){
						if (sameLetter(sub))
							return 1;
						else
							return sub.length();
					}

				}
			}
		}
		return 0;
	}
};
由于超出时间限制,并且展开原题中的tag,换了一个思路:使用哈希表,再使用两个指针,一个指针指向当前遍历的字符串的开始位置,如果遇到重复字符x,就将该指针的位置改为上一个x的位置后一个。并更新哈希表。

int lengthOfLongestSubstring(string s) {
		int hash[128];
		memset(hash, -1, 128 * sizeof(int));
		int start = 0;
		int maxLen = 0;
		int i;
		for (i = 0; i < s.length(); i++){
			if (hash[s[i]] != -1){
				if (maxLen < i - start)
					maxLen = i - start;
				memset(hash + start, -1, (hash[s[i]]-start)*sizeof(int));
				if (hash[s[i]]+1>start)
					start = hash[s[i]] + 1;
			}
			hash[s[i]] = i;
		}
		if (maxLen < i - start)
			maxLen = i - start;
		return maxLen;
	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: