leetcode刷刷題(45) ---- 無重複字符的最長子串(C語言版)

2020-6-5

  • 科技是槍,也是玫瑰。
    有時人們持槍遠征,荒廢了玫瑰園;
    有時人們沉迷園藝,家園卻被鐵蹄踏平。
    而在那些偉大的故事裏,人們手握鋼槍,身後鮮花盛開。

題目

  • leetcode – 3. 無重複字符的最長子串
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。

示例 1:
輸入: "abcabcbb"
輸出: 3 
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。

示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。

示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
     請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

個人解答:(C版本)

  • 使用的是時間複雜度比較高的暴力實現,就是不斷的比較,定義 r 用來存放子串右邊位置,這個值不斷右移,移動一次就與前面l位置開始到r-1的位置的值比較。詳情看代碼。

    int lengthOfLongestSubstring(char * s){
        int max_size = 0;
        int cur_size = 0;
        
        if(s == NULL)
            return 0;
        if(s[0] == '\0')
            return 0;
    
        int l = 0; // 用來存放子串最左邊的位置
        int r = 1; // 用來存放子串右邊位置,這個值不斷右移,移動一次就與前面l位置開始到r-1的位置的值比較。
        while(s[r] != '\0')
        {
            for(int i=l; i<r; ++i)
            {
                if(s[r] == s[i]) // 找到相同的值
                {
                    cur_size = r - l;
                    l = i+1; // 更新l的位置
    
                    if(max_size < cur_size)
                        max_size = cur_size;
                }
            }
            ++r;
        }
    
        cur_size = r-l;
        if(max_size < cur_size)
            max_size = cur_size;
        
        return max_size;
    }
    
  • 複雜度分析
    1)時間複雜度:兩層循環,O(N^2)。
    2)空間複雜度:O(1),只使用常數量級的變量。

  • 運行結果:
    在這裏插入圖片描述
他山之石:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章