zoukankan      html  css  js  c++  java
  • 剑指offer——50最长不含重复字符和子字符串

    题目:

      请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含’a~z”的字符。例如,在字符串“arabcacfr"中,最长的不含重复字符的子字符串是“acfr”,长度为4。

    题解:
      方法一:

        使用滑动窗口函数【借助string中的find函数】

      方法二:
        使用动态规划

      

     1 //方法一:使用移动窗口
     2 string getLenghtSubstr(const string &str)
     3 {
     4     if (str.length() < 2)return str;
     5     string res, temp;
     6     int L = 0, R = 1;
     7     res.assign(str.begin() + L, str.begin() + R);
     8     temp = res;
     9     while (R < str.length())
    10     {
    11         if (temp.find(str[R])!=-1)
    12         {
    13             res = res.length() >= temp.length() ? res : temp;
    14             L = R;
    15             temp = "";
    16         }
    17         temp += str[R];
    18         R++;
    19     }
    20     return res.length() >= temp.length() ? res : temp;
    21 }
    22 
    23 //方法二:使用动态规划
    24 //与移动窗口函数类似,只不过是用数组代替了string.find
    25 string DP(const string &str)
    26 {
    27     if (str.length() <= 1)return str;
    28     vector<int>word(26, -1);
    29     string curStr = "", maxStr = "";
    30     //int curL = 0, maxL = 0;
    31     for (int i = 0; i < str.length(); ++i)
    32     {
    33         int index = word[str[i] - 'a'];
    34         if (index<0 || i - index>curStr.length())//如果没出现过,或者出现的位置在我目前记录的子串的前面,那么第i个字母我可以添加
    35             curStr += str[i];  //++curL
    36         else //第i个字母重复在我目前记录的子串中
    37         {
    38             maxStr = curStr.length() > maxStr.length() ? curStr : maxStr;//先更新
    39             //maxL = curL > maxL ? curL : maxL;
    40             curStr += str[i];
    41             curStr.erase(0, curStr.length() - (i - index));//删除重复节点
    42             //curL = i-index;
    43         }
    44         word[str[i] - 'a'] = i;
    45     }
    46     return curStr.length() > maxStr.length() ? curStr : maxStr;
    47     //return curL > maxL? curL :maxL;
    48 }

      

  • 相关阅读:
    QLPreviewController来预览文件
    Camera360SDK
    实现 JSON + Jquery+.Net ajax功能
    showModalDialog传值
    web方式AJAX调用
    CRM4.0多个实体关联查询
    用javascript 动态添加部门和人员
    GridView中使用超连接
    根据订单号查询出订单附属实体
    sql 常用聚合函数
  • 原文地址:https://www.cnblogs.com/zzw1024/p/11700465.html
Copyright © 2011-2022 走看看