C++語言演算法之求任意兩個相同字元的最大距離

丶幻一發表於2018-03-22

提問

我們有一個這樣的字串abcaffdffqwwwwrcs,最大長度的多少呢?我們發現兩個c直接的距離最大,這裡最大長度應該是第2個c的位置-第一個c的位置。

演算法思路

下面來講一下演算法是實現思路:
先來看看,我們如何求第一個字母a之間的距離,我們先確定a的位置是第一個,我們用一個變數儲存a的位置,然後再通過下標移動到底2個a的位置,只需要將第二個位置減去第一個位置即可,這就得到了兩個字母之間的距離。
那麼問題來了,我們一個字串有這麼的多字元,那麼我們如何存放每個字元的位置。這裡只需要將每個字元的位置記錄在一個陣列中,用字元的ascii碼作為陣列的下標,然後通過這個下標來訪問,直接記錄或者讀取陣列記錄的位置。
這時候我們每個字元的位置都能記錄,但是這個時候,如何求任何兩個字元直接的距離,我們需要一個變數來記錄最大距離,通過任何兩個字元之間的距離與這個變數比較,如果遇到更遠的,就記錄在這個變數中,直達整個字串都讀取一遍。

演算法實現

//C++實現方法
public:
    static int lengthOfLongestSubstring(String s){
        vector<int> dict(256,-1);
        int maxLen = 0,start = -1;
        for(int i = 0;i<s.length();i++){
            if(dict[s[i]] > -1){
                start = dict[s[i]];
                maxLen  = max(maxLen,i-start)'
            }
            dict[s[i]] = i;
        }
        return max;
    }
//C語言實現方法
int lengthOfLongestSubstring(const char * str) {
    int dict[256];
    int i = 0;
    for (; i<256; i++) {
        dict[i] = -1;
    }
    int maxLen = 0;
    for (i = 0; i < strlen(str); i++) {
        if (dict[str[i]]>-1) {
            maxLen = max(maxLen, i - dict[str[i]]);
        }
        dict[str[i]] = i;
    }
    return maxLen;
}

相關文章