zoukankan      html  css  js  c++  java
  • [LeetCode] Longest Substring Without Repeating Characters最长无重复子串

    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.

    Hide Tags
     Hash Table Two Pointers String
     
        这题有前面的基础其实很简单的,http://www.cnblogs.com/Azhu/p/4127606.html
        思路类似,使用双索引表示目标的头尾,左索引指向能去的第一个,右索引指向不取的第一个,那么初始化均为0,长度就是右-左,两者相等表示子串为空。
    注意:
    • 子串与子序列不同,子串是需要连续的,子序列只要求顺序,不要求连续。
    • 表示好子串(窗口)很重要,确认清楚索引指向是否在窗口内。
    • 因为需要标记字符,所以直观想到的是hash_map or  unordered_map,不过基于AscII 只要一个128 位的bool 数组,discuss 他们声明为256,不过用128通过了。
    • 数组下标如果直接使用字符好像隐式转换失败,需要加上强制转换。

    算法实现:

    1. 初始化窗口索引lft=rgt=0,同时初始化标记数组,表示那个一个字符是否在窗口内。
    2. 右索引遍历字符串
      • 如果遇到不在窗口内的字符rgt+1,改变flag,计算更新最长子串长度。
      • 如果在窗口内,lft+1,修改flag,重新判断rgt 位置的字符。

    我写的代码:

     1 #include <iostream>
     2 #include <string>
     3 using namespace std;
     4 
     5 class Solution {
     6 public:
     7     int lengthOfLongestSubstring(string s) {
     8         int n = s.length();
     9         if(n<2) return n ;
    10         int lft = 0,rgt =0,maxlen = 0;
    11         bool sign[128] = {false};
    12         while(rgt<n){
    13 //            cout<<lft<<" "<<rgt<<" "<<maxlen<<endl;
    14             if(sign[(int)s[rgt]]==false){
    15                 sign[(int)s[rgt]]=true;
    16                 rgt++;
    17                 if(maxlen<rgt-lft)  maxlen = rgt - lft;
    18                 continue;
    19             }
    20             sign[(int)s[lft]] =  false;
    21             lft++;
    22         }
    23         return maxlen;
    24     }
    25 };
    26 
    27 int main()
    28 {
    29     string s= "242522f23r23rt432twrfs122";
    30     Solution sol;
    31     cout<<sol.lengthOfLongestSubstring(s)<<endl;
    32     return 0;
    33 }
    View Code
  • 相关阅读:
    生成1--n的全排列
    小P的秘籍
    小P的字符串
    小P的金字塔
    2198: 小P当志愿者送餐
    交换排序(快速排序重点)
    关于上级机构的冲突性测试bug修复
    系统当前时间system.currenttimemillis与new Date().getTime() 区别
    Servlet中(Session、cookies、servletcontext)的基本用法
    默认图片展示(个人信息模块)
  • 原文地址:https://www.cnblogs.com/Azhu/p/4132670.html
Copyright © 2011-2022 走看看