1. 程式人生 > >LeetCode3最長無重複字元的子串/C++--Set用法

LeetCode3最長無重複字元的子串/C++--Set用法

初始化:
map和set封裝了二叉樹等
成員函式方式提供的常用操作,如:插入、排序、刪除、查詢等。

set<int> s;

set作為一個容器也是用來儲存同一資料型別的資料型別,並且能從一個數據集合中取出資料,在set中每個元素的值都唯一,而且系統能根據元素的值自動進行排序。應該注意的是set中數元素的值不能直接被改變。C++ STL中標準關聯容器set, multiset, map, multimap內部採用的就是一種非常高效的平衡檢索二叉樹:紅黑樹,也成為RB樹(Red-Black Tree)。RB樹的統計效能要好於一般平衡二叉樹,所以被STL選擇作為了關聯容器的內部結構。

關於set的一個很好的例子
Given a string, find the length of the longest substring without repeating characters.

Examples:

Given “abcabcbb”, the answer is “abc”, which the length is 3.

Given “bbbbb”, the answer is “b”, with the length of 1.

Given “pwwkew”, the answer is “wke”, with the length of 3. Note that the answer must be a substring, “pwke” is a subsequence and not a substring.

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
         set<char> myset;
        int ans = 0, i = 0, j = 0;
        for(; i < s.length(); ++i){
            while(myset.insert(s[j]).second && j < s.length()){
                j++; 
                ans = max(ans, j-i);
            }
            myset.erase(s[i]);
        }
        return
ans; } };

假設輸入時pwwkew.
當i=0時:插入第一個p到myset中,返回1,且長度小於length.j自加1為1。ans取1。
插入第二個w到myset中,返回1,長度小於length,j自加1為2,ans取2。
插入第三個w到myset中,返回0。跳出
清楚第二個w元素。
當i=1時:插入第三個w到myset中,返回1,且長度小於length.j自加1為3。ans取2。
插入第四個k到myset中,返回1,且長度小於length,j自加1為4,ans取2。
插入第五個e到myset中,返回1,且長度小於length,j自加1為5,ans取3。


重複上面步驟最後計算出3。