码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode [003] : Longest Substring Without Repeating Characters

时间:2015-09-11 10:41:08      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

 

思路:

1、two pointer类型题目

2、本题贪心一下,从头到尾遍历一遍即可

3、用两个指针,来表示当前选取的字符串(两个指针像滑动窗口slider window一样从前往后移动)

4、后面一个指针的移动规则   :

    每次向后移动一位,同时也控制循环

5、前面一个指针的移动规则   :

    后指针移动之后,检测当前是否有重复,如果有重复,那么前指针移动到重复点+1的位置

6、记录当前的最大值

7、如何检测重复  :

    显然,用遍历的方式去检测最后一个字符是否重复是非常影响效率的。假如说当前的最大值为一个很大的数字N,那么检测重复就要花N的时间。

    但还有另外一种方式:

    保存每个字符的上一次出现位置(last position)(也可以看作位置hash),如果当前后指针指向的字符出现的位置减去当前最大值小于等于这个字符的上次出现位置,那么必定重复(这个就像一个滑动窗口,窗口的长度就是最大长度,滑动窗口的后面对齐后指针,而前面因为要保持最大长度,所以这个长度可能会越界last position这个位置,只要越界,就说明有重复)

 

    注:源代码采用不是上面说的  "减去当前最大值",而是使用的"last position加上当前最大值"是否越界后指针来判断的,其本质都是一样的。

 

源代码如下:

#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <list>
#include <queue>
#include <ctime>
using namespace std;

#pragma warning(disable:4996)

//Given a string, find the length of the longest substring without repeating characters. 
//For example, the longest substring without repeating letters for "abcabcbb" is "abc", 
//which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if (s.size() == 0) return 0;
        int iLoc[256];
        for (int i = 0; i < 256; ++i) iLoc[i] = -1;
        int iLongestLenTemp = 0;
        int iLongest = 0;
        for (int i = 0; i < (int)s.size(); ++i)
        {
            if (iLoc[s[i]] == -1)
            {
                ++iLongestLenTemp;
                iLoc[s[i]] = i;
            }
            else
            {
                if (iLoc[s[i]] + iLongestLenTemp < i)
                {
                    ++iLongestLenTemp;
                    iLoc[s[i]] = i;
                }
                else
                {
                    iLongestLenTemp = i - iLoc[s[i]];
                    iLoc[s[i]] = i;
                }
            }
            if (iLongestLenTemp > iLongest)
                iLongest = iLongestLenTemp;
        }
        return iLongest;
    }
};

int main()
{
    string s = "wlrbbmqbhcdarzowkkyhiddqscdxrjmowfrxsjybldbefsarcbynecdyggxxpklorellnmpapqfwkhopkmco";
    printf("%d\n", s.size());
    Solution solu;
    int LongestSubLen  = solu.lengthOfLongestSubstring(s);
    printf("%d\n", LongestSubLen);
    return 0;
}

 

leetcode [003] : Longest Substring Without Repeating Characters

标签:

原文地址:http://www.cnblogs.com/lqy1990cb/p/4799960.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!