您的位置:首页 > 其它

Longest Substring Without Repeating Characters

2015-07-01 14:47 190 查看
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.

问题描述:

在已给定的字符串中寻找最长不重复的字符序列

解决方案1:思路:将所有的不重复字符串放在矢量数组当中,然后依次比较字符串的长度大小

class Solution {
private:
	vector<vector<char>*>root;
public:
	int lengthOfLongestSubstring(string s) {
		const	char* _str = s.c_str();
		int len = s.length();
		vector<char>* tmp = NULL;
		vector<char>::iterator itr;
		int i = 0;
		int nCount = 0;
		if (len == 0)
			return 0;
		for (; i < len; i++)
		{
			const char* cur = _str + i;
			if (tmp != NULL)
			{
				itr = find(tmp->begin(), tmp->end(), cur[0]);
				if (itr != tmp->end())
				{
					//找到了重复的字符串
					i = nCount++;
					//并把当前vector放在链表当中
					root.push_back(tmp);
					tmp = NULL;
				}
				else
				{
					tmp->push_back(cur[0]);
				}
			}
			else
			{
				tmp = new vector<char>();
				tmp->push_back(cur[0]);
			}			
		}
		if (tmp != NULL)
		{
			root.push_back(tmp);
		}		
		int max = root.at(0)->size();
		vector<vector<char>*>::iterator itr_1 = root.begin();
		for (; itr_1 != root.end(); itr_1++)
		{
			if (max < (*itr_1)->size())
				max = (*itr_1)->size();
		}
		return max;

	}
	~Solution()
	{
		vector<vector<char>*>::iterator itr_1 = root.begin();
		for (; itr_1 != root.end(); itr_1++)
		{
			delete* itr_1;
		}
	}
};
方案2:思路--设置指针start和end两个指针,我们使用tmp从start到end进行移动,如果没有检查到重复字符,则重设max大小,

如若检查到重复字符,则检查当前不重复大小,进行比较,start++,重新下一轮测试。

note:如果内轮循环结束,重新进行外轮循环时,则需计算max,因为有可能是最后的不重复字符串。

class Solution {	
public:
	int lengthOfLongestSubstring(string s) {		
int len = s.length();
		if (len == 0)
			return len;
		const char*start = s.c_str();
		const char*end = start;
		int max = 0;		
		for (; start!=s.c_str()+len; start++)
		{
			bool mark = false;			
			const char* tmp = start;
			for (end = start; end != s.c_str() + len; end++)
			{				
				tmp = start;
				for (; tmp != end; tmp++)
				{
					if (tmp[0] == end[0])
					{
						mark = true;
						break;
					}
				}
				if (mark)
				{
					//记录当前不重复的大小,与max进行比较,重置i				
					int cur_len = end - start;
					if (max < cur_len)
					{
						max = cur_len;
					}
					break;
				}
				else
				{
					//没有找到,则end++,直接进行下一步操作
					tmp = end;
				}
			}
			if ( (!mark))
			{
				int cur_len = end - start;
				if (max < cur_len)
				{
					max = cur_len;
				}

			}
		}		
		return max;
	}
	
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: