1. 程式人生 > >Leetcode 3.無重複字元的最長子串(C語言佇列)

Leetcode 3.無重複字元的最長子串(C語言佇列)

題目:

本文給出了:沒有重複字元的最長子串

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

示例:

給定"abcabcbb",沒有重複字元的最長子串是"abc" ,那麼長度就是3. 
給定"bbbbb" ,最長的子串就是  "b" ,長度是1 
給定  "pwwkew",最長子串是"wke",長度是3,請注意答案必須是一個子串,"pwke"是子序列而不是子串。

思路:

       差不多約等於小白的我拿到這個題其實不太知道怎麼弄呢,研究了半個小時也沒研究出啥有用的東西呀。但是腦子裡靈光一閃想到學校學過的資料結構的佇列好像正好用在這個題中呢〜

       然後就在紙上畫畫就出了自己的一點想法了:遇到不同的字母就入佇列,遇到相同的字母就記錄下上一個相同字母的位置,同時記錄此時佇列裡的元素和長度,再將之前那個相同字母和它前面的元素全部出佇列,如此反覆就可以得到每次行成的只含有不同元素佇列中的元素和長度啦〜比較每次佇列的長度就能夠得到字元的最長值啦〜

程式碼:

struct SqQueue{
	char data[100000];
	int front;//隊首指標
	int rear;//隊尾指標
}SqQueue;

int enQueue(struct SqQueue *qu,char x){
    qu->rear=qu->rear+1;
    qu->data[qu->rear]=x;
	return 1;
} //入佇列

int deQueue(struct SqQueue *qu,int y){
    qu->front=y+1;
	return j;
}//將第y個之前的元素出佇列

int lengthOfLongestSubstring(char* s) {
    int i,j,len,max;
    int longth=0;
    len=strlen(s);
    if(len==0)
        return 0;
    struct SqQueue *sq=(struct SqQueue *)malloc(sizeof(struct SqQueue));//建立佇列
    sq->front=0;
    sq->rear=0;
    sq->data[0]=s[0];
    max=0;
    for(i=1;i<len;i++)
    {
        for(j=sq->front;j<=sq->rear;j++)
        {
            if(s[i]==sq->data[j])
            {
                longth=deQueue(sq,j);
                if(longth>max)
                {
                    max=longth;
                }
                break;
            }
        }
        enQueue(sq,s[i]);
    }
    longth=deQueue(sq,sq->rear);
    if(longth>max)
        max=longth;
    return max;
}

執行:

       實際執行的過程中,沒有通過測試,原因是忘記加判斷輸入符號佇列是否為空的情況導致輸入小號為空的時候輸出為1,但是實際應該輸出0自己還是太菜啦,最基本的條件都忘記= =