LeetCode之旅(C/C++):3. 无重复字符的最长子串

#PS:不明之处,请君留言,以期共同进步!

##1、题目描述
给定一个字符串,找出不含有重复字符的最长子串的长度。

###示例 1:

输入: “abcabcbb”
输出: 3
解释: 无重复字符的最长子串是 “abc”,其长度为 3。
###示例 2:

输入: “bbbbb”
输出: 1
解释: 无重复字符的最长子串是 “b”,其长度为 1。
###示例 3:

输入: “pwwkew”
输出: 3
解释: 无重复字符的最长子串是 “wke”,其长度为 3。
请注意,答案必须是一个子串,“pwke” 是一个子序列 而不是子串。
##2、代码实现
###2.1 C++语言

//O(n^2)
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if (s.size() <= 1)//字符串长度是0或1时,直接输出
            return s.size();
        int len = 1;//字符串长度大于1时,子串最短是1
	    string::iterator iterStart = s.begin();//子串的开始元素(包含)
	    string::iterator iterTmp = iterStart + 1;//子串的结束元素的下一位(不包含)
	    for (; iterTmp != s.end(); ++iterTmp)//在母串中循环,判断iterTmp指向的元素是否在子串中已存在重复的元素
	    {
		    int count = 0;//统计最长子串的长度
		    string::iterator iterSubTmp = iterStart;
		    for (; iterSubTmp != iterTmp; ++iterSubTmp)//在子串中循环,判断是否已经包含与母串中的iterTmp指向的元素重复的元素
		    {
			    if (*iterTmp == *iterSubTmp)//重复
			    {
				    iterStart = iterSubTmp + 1;//子串的开始元素变成重复元素的下一个元素
				    break;//跳出子循环,去判断母串的下一个元素是否在子串中
			    }
			    else//不重复
			    {
				    ++count;//长度增加
				    continue;//直接跳到下一次子循环
			    }
		    }
		    if (iterSubTmp == iterTmp)//当子循环全部完成,若子串指针移动到母串指针的位置,即全部都不重复
		    {
			    ++count;//则把iterTmp指向的元素加入子串,长度增加
			    if(len < count)//如果当前子串长度比之前最长的子串长度都长,则更新最长的长度值
			    	len = count;
		    }
	    }
	    return len;//最终返回最长子串长度
    }
};

###2.2 C语言

//O(n^2)
//思路和C++完全一样,不再注释了
int lengthOfLongestSubstring(char* s) {
	if (strlen(s) <= 1)
		return strlen(s);
	int len = 1;
	char * pStart = s;
	char * pEnd = s + 1;
	for (; *pEnd != '\0'; ++pEnd)
	{
		int count = 0;
		char * pTmp = pStart;
		for (; pTmp != pEnd; ++pTmp)
		{
			if (*pEnd == *pTmp)
			{
				pStart = pTmp + 1;
				break;
			}
			else
			{
				++count;
				continue;
			}
		}
		if (pTmp == pEnd)
		{
			++count;
			if (len < count)
				len = count;
		}
	}
	return len;
}

你可能感兴趣的:(LeetCode之旅)