您的位置:首页 > 职场人生

剑指Offer(第二版)面试题48:最长不含重复字符的子字符串

2018-01-08 15:31 465 查看

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


参考文献

剑指offer第二版-48.最长不含重复字符的子字符串(动态规划)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐