思路:
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;
}
}