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;
}
}

猜你喜欢

转载自blog.csdn.net/qq_29442755/article/details/79658322