题目:找字符串中最长的不重复子串
方法1:使用string
和vector<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