1. 程式人生 > >leetcode 3:無重複字元的最長子串

leetcode 3:無重複字元的最長子串

給定一個字串,找出不含有重複字元的最長子串的長度。

示例 1:

輸入: "abcabcbb"
輸出: 3 
解釋: 無重複字元的最長子串是 "abc",其長度為 3。

示例 2:

輸入: "bbbbb"
輸出: 1
解釋: 無重複字元的最長子串是 "b",其長度為 1。

示例 3:

輸入: "pwwkew"
輸出: 3
解釋: 無重複字元的最長子串是 "wke",其長度為 3。
      請注意,答案必須是一個子串,"pwke"是一個子序列 而不是子串。j

解法一:

int lengthOfLongestSubstring(char *s)
{
	int length = strlen(s);
	char *temps = (char *)malloc(length*sizeof(char));//輔助陣列
	int count = 0;//輔助陣列index
	int start = 0;//最長字串起始index
	int len = 0;//最長字串長度
	bool isok = true;
	for (int i = 0; i < length;)
	{	
		if (isok)
			temps[count++] = s[i++];//加入新元素
		isok = true;//標誌位置位
		for (int j = start; j < count-1; j++)//檢測新加入的元素是否已經存在
		{
			if (temps[j] == s[i-1])//如果已經存在,break,起始字元後移
			{
				isok = false;//標誌位置位
				
				start++;//起始字元後移
				break;
			}
		}
		len = len>(i - start) ? len : (i - start);//計算長度
	}
	return len;
}

解法二:發現自己蠢了,不用建立什麼輔助陣列,建立個頭尾用滑窗就好啦

int lengthOfLongestSubstring(char* s) 
{
	int start = 0, end = 1;//設定滑窗頭尾
	int maxlen = 1;//最大長度
	if (!strlen(s))
	{
		return 0;
	}
	else if(strlen(s) == 1)
	{
		return 1;
	}
	int len = strlen(s);
	for(;end<len;end++)
	{
		for(int i = start;i<end;i++)
		{
			if(*(s+i) == *(s+end))//比較下一個元素和滑窗已有元素
			{
				
				start = i + 1;
				break;
			}
		}
		if ((end - start)+1 > maxlen)//比較大小
			maxlen = (end - start) + 1;	
	}
	return  maxlen;
}

解法三:利用map容器

class Solution {  
public:  
    /** 
    * @param s
    * @return
    */  
    int lengthOfLongestSubstring(string s) {  
        // write your code here  
        int ret = 0;  
        map<char, int> m;  
        int start = 1;  
        for (int i = 1; i <= s.length(); i++)  
        {  
            char c = s[i - 1];  
            if (m[c] >= start)  
            {  
                start = m[c] + 1;  
                m[c] = i;  
  
            }  
            else  
            {  
                m[c] = i;  
                ret = max(ret, i - start + 1);  
            }  
  
        }  
        return ret;  
    }  
};