LeetCode-3. 無重複字元的最長子串

kewlgrl發表於2018-05-01

3. 無重複字元的最長子串

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

示例:

給定 "abcabcbb" ,沒有重複字元的最長子串是 "abc" ,那麼長度就是3。

給定 "bbbbb" ,最長的子串就是 "b" ,長度是1。

給定 "pwwkew" ,最長子串是 "wke" ,長度是3。請注意答案必須是一個子串"pwke" 是 子序列  而不是子串。


C



#include<bits/stdc++.h>
using namespace std;
/********************提交程式碼********************/
int lengthOfLongestSubstring(char* s)
{
    int i,j,n=strlen(s),res=0,ans=0;
    int *a=(int*)malloc(n*sizeof(int));
    for(i=0; i<n; ++i)
    {
        a[i]=s[i]-'A';//字元陣列轉成int儲存方便判斷是否vis
        if(a[i]>res)//轉換的最大數值
            res=a[i];
    }
    bool *vis=(bool*)malloc((res+1)*sizeof(bool));//訪問標記
    for(j=0; j<n; ++j)
    {
        res=0;
        for(i=0; i<n; ++i)//注意初始化
            vis[a[i]]=false;
        for(i=j; i<n; ++i)//從第i個位置依次往後遍歷
        {
            if(!vis[a[i]])//未出現過
            {
                vis[a[i]]=true;
                ++res;
            }
            else//出現過直接跳出
                break;
            if(res>ans)//更新最長串長度
                ans=res;
        }
    }
    return ans;
}
/***************************************************/
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("F:/cb/read.txt","r",stdin);
    //freopen("F:/cb/out.txt","w",stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    char s[1000];
    while(cin>>s)
    {
        cout<<lengthOfLongestSubstring(s)<<endl;
    }
    return 0;
}


暴力出奇跡( ̄▽ ̄)~*,從頭到尾依次作為起始位置遍歷到最後(有重複字元)。

三點。

1、不能用a=int(c)這樣的顯式強制轉換,我只能隱式強制轉換了;

2、申請vis的記憶體時注意取最大值加一。

3、子序列可以不是連續字元,而子串必須是連續的。

相關文章