2018年3月4日 星期日

[3] Longest Substring Without Repeating Characters

不敢相信!!!
竟然沒寫很久就Accepted了 !!!
感人!!!
找一個字串裡面, 不重覆字元的最長子字串的長度
substring 不等於 subsequence
所以 pababcd 最長是 abcd長度 4
而不是 pabcd長度 5
因為 pabcd 只是subsequence而已, 並不是 substring


Longest Substring Without Repeating Characters
int max (int a, int b){
    return (a>b)? a: b;
}

int lengthOfLongestSubstring(char* s) {
    int len = strlen(s);
    if (len<=1)
        return len;
    int ascii[128];
    int i,tmp, ret=0, start=0, end=len;
    for(i=0;i<128;i++)
        ascii[i]= -1;

    for(i=0;i<len;i++)
    {
        if (ascii[s[i]] >= 0)
        {
            end = i;
            tmp = end - start;
            if (tmp > ret)
                ret = tmp;
            start = max(ascii[s[i]] +1 , start);
        }
        ascii[s[i]] = i;
    }
    end = len-1;
    tmp = end - start + 1;
    if (tmp > ret)
        ret = tmp;

    return ret;
    
}

結果我2022年11月13號回來寫了一個什麼呢? XD
int lengthOfLongestSubstring(char * s){
int hash[128];
int ret=0;
for (int i=0;i<strlen(s);i++)
{
memset(hash,0, sizeof(int)*128);
hash[s[i]]++;
int count=1;
for (int j=i+1; j<strlen(s);j++)
{
if (hash[s[j]] >0)
break;
else
{
hash[s[j]]++;
count++;
}
}
if (count > ret)
ret = count;
}
return ret ;
}


[20240216]
沒想到2024年又回來寫了XD 漫漫長路啊~(痛哭)
2022年寫的算是暴力解(吧)這次寫的算是sliding window還是two pointers呢?!
雖然好像有長進但其實寫不出來 XD 考慮不周啊QQ
當右邊出現"已出現過的字元",左邊的index 要一直移動到該字元只剩一個為止!
而不是只移動一個!冷靜想想也是QQ 我很笨~屋屋屋

int max (int a, int b){
return (a>b)? a: b;
}

int lengthOfLongestSubstring(char* s) {
int *hash = calloc (128, sizeof(int));
int len = strlen(s);
if (len <=1)
return len;

int l=0,r=1;
hash[s[0]-' ']++;
int ret = 1;
while (r<len)
{
hash[s[r]-' ']++;
while (hash[s[r]-' ']>1)
{
hash[s[l]-' ']--;
l++;
}
ret = max(ret,r-l+1);
//printf("ret: %d %d %d\n",l,r, ret);
r++;
}
return ret;
}

沒有留言:

張貼留言