剑指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 }

  

原文地址:https://www.cnblogs.com/zzw1024/p/11700465.html