3. Longest Substring Without Repeating Characters(求最长的不重复的连续的子序列。)

官网

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.

题目大意

  • 1.求最长的不重复的连续的子序列。

解题思路

  • 1.如果这个字母重复了,找到它之前的那个位置,那么从它之前的那个位置的后一个开始计算的话到现在这个位置就不是重复的了。例如:1 2 3 4 3 7 5 6,这里,3是第一个重复的,找到他之前出现的那个位置的后一个位置即4,这个时候重新开始往后看有事一条好汉了是不是?

AC代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        //重复了就从之前那个位置的后一个再来
    int i = 0, j = 0;
    int visited[256];
    int maxlen = 0;
    fill(visited, visited + 256, 0);
    while (j < s.length()){
        if (visited[s[j]] == 0){
            visited[s[j]] = 1;
            j++;
        }
        else{
            //如果已经访问过了,找到它之前访问过的位置,顺便将他之前的一段子序列标记为未访问,因为下一个起点已经变为k+1了
            while (s[i] != s[j]){
                maxlen = max(maxlen, j - i);
                visited[s[i]] = 0;
                i++;
            }
            //然后从它后一个位置开始访问,那么j位置就不是重复的了,就可以继续向后看了
            i++;
            j++;
        }
    }
    maxlen = max(maxlen, j - i);
    //cout << maxlen << endl;
    return maxlen;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值