Leetcode 至多包含兩個不同字元的最長子串

2021-10-07 15:58:54 字數 1481 閱讀 4541

題目:給定乙個字串s,找出至多包含兩個不同字元的最長子串t,並返回該子串的長度。

思路:使用hash表的優點在於,使用陣列儲存正在找的字元,用兩個陣列就很方便。統計個數也好,還是替代也好。其實看到這個題目,就知道有三種情況,第一種,表中只有兩種字元以下的情況,只需要把新來的加入表中,或者把已存在的加入表中。第二種,表中有兩個字元,但是新來的是這兩個字元中的乙個,此時只需要加個數。第三種,也是最複雜的,就是已經有兩個了,但是新來的字元不同,因此,需要消掉第乙個字元,第乙個字元是哪個,有幾個,怎麼消除。就是這個題目的難點。

#define hashnum 128 //z ascii碼值為127

int checkhashnum(const int *hasharry)

for (int i = 0; i < hashnum; i++)

}return valuenum;

}int max(const int num1, const int num2)

else

}int lengthoflongestsubstringtwodistinct(char * s)

int maxnum = 0;

int nownum = 0;

int start = 0;

int cnt = 0;

int strlen = strlen(s);

int hash[hashnum] = ;

for (int i = 0; i < strlen; i++)

/*情況二,hash表有兩個不同的字元,但是接下來的字元是其中之一,也加入hash中,處理完continue*/

if (cnt == 2)

}/*情況三,hash中有兩種字元,但是接下來的字元不同於兩種字元,因此去掉最頭的字元,此處hash表的優勢就體現出來了,因此沒有用兩個指標移動的形式,而是用hash表以陣列的形式儲存,用指標的形式的化,如果兩個不同字元不是連續的,還要判斷第乙個字元最後一次出現在***/

while (checkhashnum(hash) >= 2 && start < strlen)

hash[s[i]]++;

nownum++;

maxnum = max(maxnum, nownum);

}return maxnum;

}

寫**途中的誤區,這個continue,腦袋中一定要把邏輯理清,什麼時候停,什麼時候往下面跑

cnt = checkhashnum(hash);

/*情況一,hash表只有乙個種字元,處理完繼續處理下乙個,因此帶contiue*/

if (cnt < 2)

/*情況二,hash表有兩個不同的字元,但是接下來的字元是其中之一,也加入hash中,處理完continue*/

if (cnt == 2)

}

兩個類互相包含的問題

今天在寫自己專案時碰到兩個類互相包含的問題,查詢了下網上的資料,整理如下 在構造自己的類時,有可能會碰到兩個類之間的相互引用問題,例如 定義了類a類b,a中使用了b定義的型別,b中也使用了a定義的型別 class a class b 請注意上面的定義內容,一般情況下是不能出現類a,類b相互引用都定義...

兩個類相互包含的問題

1,問題介紹 在 date.h 檔案中宣告了date這個類,在 date.cpp 檔案中定義了date 這個類 在 time.h 檔案中宣告 time 這個類,在 time.cpp 中定義time這個類。在date類中包含乙個time 類物件,在time類中包含乙個date類物件。那麼,date.h...

兩個類標頭檔案互相包含

c 中兩個類的標頭檔案互相包含問題 csdn部落格 我們知道,當乙個類 設類a 中包含另乙個類 設類b 的物件時,必須在該檔案中包含另乙個類的標頭檔案,如果兩個類都互用到了對方的物件,理論上就要互相包含標頭檔案,但是這樣是不可取的。貼出 如下 這樣是無法通過編譯的,其原因是它們的標頭檔案互相包含了,...