思路:
1. 用i,j记录当前操作的子字符串,i为起点,j为终点,j-i为子字符串长度;(i,j是给定字符串中的下标位置)
每次移动j读取一个新字符,比较子字符串(用容器暂存)中有无重复的字符,若有,说明子字符串长度要变,将起点i右移;
此时不代表重复的那个字符串从容器中移除了,如:abc bda,j指向第二个b时,i指向a;因为子字符串(无重复)应是连续相邻
的字符串,当前子字符串“abc”已经遇到重复元素,说明“abc”这个无重复连续子字符串长度就是3了,但给定字符串还未取完,所以要重新找无重复连续子字符串,ab均要移除容器,下一个起点为c;
因此程序不急于弹出重复元素,而是每次弹出起点i所指的元素(弹出后i+1);
2. 当前无重复连续子字符串长度为j-i,但每一轮取得的子字符串长度应被保存,ans=max(ans,j-i);该语句将每一轮取得长度与之前作比较,将较大值存在ans中,因此最后得到的ans值即为所求。
#include <iostream>
#include <vector>#include <algorithm>
using namespace std;
/*
题目描述:给定一个字符串,找出最长的没有重复字符的子字符串的长度
如:“abcabcd”
无重复子字符串长度为4
*/int subStringSearch(char str[])
{
int n = strlen(str); //给定字符串长度
int ans = 0; //存储无重复子字符串最大长度
int i = 0; //存储子字符串起点在给定字符串中指针的位置
int j = 0; //存储子字符串终点在给定字符串中指针的位置
vector<char> v1; //用容器暂存子字符串
vector<char>::iterator iter; //迭代器
while (j<n)
{
if (find(v1.begin(),v1.end(),str[j])==v1.end()) //未找到重复元素返回v1.end()
{
v1.push_back(str[j++]);
ans = max(ans, j - i); //每轮子字符串长度比较,保留较大值
}
else //如果有重复元素
{
v1.erase(v1.begin());
i++; //将子字符串起点后移
}
}
return ans;
}
int main()
{
char str[30];
while (cin>>str)
{
int ret = subStringSearch(str);
cout << ret << endl;
}
}