一道vector实现字典的题目 C++

使用vector 在解决一些问题的时候确实非常高效。
可以不像Array 那样一个一个去查。
可以大幅度缩减代码实现的时间。
Given a string, find the length of the longest substring without repeating characters.

Example 1:

Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
Example 2:

Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.
Example 3:

Input: "pwwkew"
Output: 3
Explanation: 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.

https://leetcode.com/problems/longest-substring-without-repeating-characters/submissions/
Leetcode 里面的第三题我的解法,非常冗长。

int main(){
    string s = "qrebtmppwuuhapcegnaon";
    char t_string[101]="";
    int max_ceil = 0;
    int ceil = 0;
    for (int i=0; i<s.length()-max_ceil;i++){
        for(int j=0; j<s.length()-i; j++){
            for(int k=0; k < ceil;k++){
                if(s[i+j] == t_string[k]){
                    if(ceil>max_ceil){
                        max_ceil = ceil;
                    }
                    ceil=0;
                    j=0;
                    i++;
                    break;
                }
            }
            t_string[ceil]=s[i+j];
            ceil++;
        }
    }
    if(ceil>max_ceil){
        max_ceil = ceil;
    }
    cout<< max_ceil;
return 0;
}

在上面看到一个大神的解法,拿来分享。

 int main(){
        string s="uvuioinmk";
        int maxLen = 0;
        vector<int> dict(256, -1);
        int start = -1;
        for(int i=0; i<s.length();i++){
            if(dict[s[i]]>start)//该重复字符有效...
                start = dict[s[i]]; //替换到最近出现的重复字符位置
            dict[s[i]] = i; //最近出现的位置
            maxLen = max(maxLen, i - start);
        }
        cout<<maxLen;
}

注释是我自己加的,理解这个算法确实需要一点抽象思维。

猜你喜欢

转载自www.cnblogs.com/venusian/p/10480872.html