剑指Offer(第二版)面试题48:最长不含重复字符的子字符串
题目要求:
输入一个字符串(只包含a~z的字符),求其最长不含重复字符的子字符串的长度。例如对于arabcacfr,最长不含重复字符的子字符串为acfr,长度为4。
解题思路:
动态规划。用dp[]记录状态,dp[i]表示以下标为i的字符结尾不包含重复字符的最长子字符串长度。初始化dp[0] = 1,求maxdp。每次可以根据dp的前一个状态推导出后一个状态,因此可以省略dp数组,使用一个变量记录dp值,使用maxdp记录最大的dp值。
C++代码
#include <iostream>
#include <string>
using namespace std;
int longestSubstringWithoutDuplication(const string& str);
int main()
{
string s = "";
while(s != "-1")
{
cout << "input a string:" << endl;
cin >> s ;
int result = longestSubstringWithoutDuplication(s);
cout << s <<" longest substring count is "<< result <<endl;
}
return 0;
}
int longestSubstringWithoutDuplication(const string& str)
{
int currentCount = 0;
int maxCount = 0;
int* preLocation = new int[26];
for (int i = 0; i < 26; ++i)
{
preLocation[i] = -1;
}
cout << str.size() <<str.length();
for (int i = 0; i < str.size(); ++i)
{
int pre = preLocation[str[i] - 'a'];
if(pre < 0 || i - pre > currentCount)
{
++currentCount;
}
else
{
if(currentCount > maxCount)
maxCount = currentCount;
currentCount = i - pre;
}
preLocation[str[i] - 'a'] = i;
}
if(currentCount > maxCount)
maxCount = currentCount;
delete[] preLocation;
return maxCount;
}