c++解決給定字符串中無重複子字符串長度問題

思路:

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;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章