[Jobdu] 题目1530:最长不重复子串

题目描述:

最长不重复子串就是从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的。

 

输入:

输入包含多个测试用例,每组测试用例输入一行由小写英文字符a,b,c...x,y,z组成的字符串,字符串的长度不大于10000。

 

输出:

对于每组测试用例,输出最大长度的不重复子串长度。

 

样例输入:
absd

abba

abdffd
样例输出:
4

2

4

阿尔卡特2013年实习生招聘笔试题

 

 1 #include <iostream>

 2 using namespace std;

 3 

 4 int main() {

 5     string s;

 6     while (cin >> s) {

 7         int *a = new int[s.length()];

 8         int max = 1;

 9         bool flag;

10         a[0] = 1;

11         for (int i = 1; i < s.length(); ++i) {

12             flag = true;

13             for (int j = 1; j <= a[i - 1]; ++j) {

14                 if (s[i - j] == s[i]) {

15                     a[i] = j;

16                     flag = false;

17                     break;

18                 }

19             }

20             a[i] = flag ? a[i - 1] + 1 : a[i];

21             max = max > a[i] ? max : a[i];

22         }

23         cout << max << endl;

24     }

25     return 0;

26 }

 滑动窗口!

 1 #include <iostream>

 2 #include <string>

 3 #include <vector>

 4 #include <algorithm>

 5 using namespace std;

 6  

 7 string s;

 8 vector<int> pos;

 9  

10 void solve() {

11     int start = 0, len = 0;

12     pos.assign(256, -1);

13     for (int i = 0; i < s.length(); ++i) {

14         if (pos[s[i]] >= start) {

15             start = pos[s[i]] + 1;

16         } else {

17             len = max(len, i - start + 1);

18         }

19         pos[s[i]] = i;

20     }

21     cout << len << endl;

22 }

23  

24 int main() {

25     while (cin >> s) {

26         solve();

27     }

28     return 0;

29 }

30 /**************************************************************

31     Problem: 1530

32     User: hupo250

33     Language: C++

34     Result: Accepted

35     Time:50 ms

36     Memory:1520 kb

37 ****************************************************************/

 

 

你可能感兴趣的:(job)