题目简介:
给定一个仅包含字符“a”-“z”的字符串。查找不包含重复字符的最长子字符串。
例一:
Input :abcdefhagikjnmlpmqorstuobvwxyz
Output :bcdefhagikjnmlp
例二:
Input:abvdefdfeskolepqwabcde
Output:skolepqwabcd
代码:
#include <iostream>
using namespace std;
int main() {
string str;
cin >> str; //输入字符串
int max = 1, begin = 0, left=0;
for (int i = 0; i < str.size(); i++) {
for (int j = begin; j < i; j++) {
if (str[j] == str[i])begin = j + 1;
}
if (i - begin + 1 > max) {
max += 1; left = begin;
}
}
for (int i = left,j=1; j <= max; i++,j++) {
cout << str[i];
}
cout << endl;
return 0;
}
代码分析:
//找出最长不重复子串头元素的索引和长度
int max = 1, begin = 0, left=0;
for (int i = 0; i < str.size(); i++) {
for (int j = begin; j < i; j++) {
if (str[j] == str[i])begin = j + 1;
}
if (i - begin + 1 > max) {
max += 1; left = begin;
}
}
max为最长不重复子字符串的长度,初始化为1;
begin为不重复子串的开头元素在原字符串的索引,初始化为0;
left为最长不重复子串的开头元素在原字符串的索引,初始化为0。
(注意区分begin和left的区别)
//输出最长不重复子串
for (int i = left,j=1; j <= max; i++,j++) {
cout << str[i];
}
cout << endl;
若是对代码的执行思路不太理解,可以设计个短点的字符串进行调试。
运行截图:
例一:
例二:
谢谢大家看到这里!
如果您觉得内容不错,或者对您有帮助的话,麻烦点个👍🏻哦🥰🥰🥰