C++找出字符串中最长的不含重复字符的子串

题目:找字符串中最长的不重复子串

方法1:使用stringvector<string>

string FindLongestNonRepeatSubstring(string str)
{
	if (str.empty()) return "";
	string tmp;//存放临时不重复的子串
	vector<string> svec;//存放所有不重复的子串
	int start = 0;//标记每次开始查找子串的下标
	int pos = -1; //查找当前字符在子串中的位置下标
	tmp.push_back(str[0]);
	for (unsigned int i = 1; i < str.size(); ++i)
	{
		pos = tmp.find(str[i]);
		if (pos == -1)
		{
			tmp.push_back(str[i]);
		}
		else
		{
			svec.push_back(tmp);
			tmp.clear();
			start = start + pos + 1;
			i = start;
			tmp.push_back(str[i]);
		}
	}

	vector<string>::iterator it = svec.begin();
	int maxIndex = 0;
	for (unsigned int i = 1; i < svec.size(); ++i)
	{
		if (svec[i].size() > svec[maxIndex].size())
		{
			maxIndex = i;
		}
	}
	return svec[maxIndex];
}

方法2:

int maxNum(int n1, int n2)
{
	return n1 >= n2 ? n1 : n2;
}

string maxNonRepeatSubstring(string str)
{
	if (str.empty()) return "";

	map<char, int> m;
	for (int i = 0; i < str.length(); ++i)
	{
		m[str[i]] = -1;
	}

	int begin = 0;// 记录最长无重复子串的起始下标
	int end = 0; //记录最长无重复子串的结束下标

	int start = -1; //用来记录当前无重复子串的起始位置
	int curLen = 0;//记录当前无重复子串的长度
	int maxLen = 0;//记录无重复子串的最大长度

	for (unsigned int j = 0; j < str.length(); ++j)
	{
		//如果start < map[str[j]],表示在str[j]的位置已经出现了重复的字符了
        //如果start >= map[str[j]],表示在str[j]的位置没有出现重复字符
		start = maxNum(start, m[str[j]]);
		curLen = j - start; // 计算当前无重复子串的长度
		if (maxLen <= curLen)
		{
			begin = start + 1; //更新无重复子串的起始下标
			end = j;
		}
		maxLen = maxNum(maxLen, curLen);
		m[str[j]] = j;//保存当前字符出现的位置
	}

	string tmp;
	for (int k = begin; k <= end; ++k)
	{
		tmp.push_back(str[k]);
	}
	return tmp;
}

参考:http://blog.csdn.net/kongkongkkk/article/details/77750745
https://www.cnblogs.com/Kobe10/p/6360993.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值