链接:https://www.nowcoder.com/questionTerminal/59b4ff4167e245c199922880c2733488
来源:牛客网
给定一个字符串,请找出其中长度最长且不含有重复字符的子串,计算该子串长度。
输入描述:
输入类型为字符串,例如”pwwkew“
输出描述:
输出类型为整型, 例如 5
示例1
输入
pwwkew
输出
3
说明
无重复字符的最长子串是"wke",其长度为 3
思路:利用map,value记录是否出现过。
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
string s,res="";
cin>>s;
unordered_map<char, int> h;
int max = 0,j=0,i=0;
while(i<s.size()&&j<s.size())
{
if(h[s[j]]==0)
{
h[s[j]]=1;
j++;
if(max<=(j-i))
max=j-i;
}
else
{
h[s[i]]=0;
i++;
}
}
cout<<max<<endl;
return 0;
}
另一种map:
#include<iostream>
#include<string>
#include<map>
usingnamespacestd;
classDistinctSubstring{
public:
int longestSubstring(string A,int n)
{
map<char,int> map_table;
int pre=0;
int*dp=new int[n]();
for(inti=0;i<n;i++)
{
if(map_table.count(A[i]))
{
if(map_table[A[i]]>=(i-pre))
dp[i]=i-map_table[A[i]];
else
dp[i]=pre+1;
}
else
dp[i]=pre+1;
pre=dp[i];
map_table[A[i]]=i;
}
int res=0;
for(inti=1;i<n;i++)
if(dp[i]>res)
res=dp[i];
delete []dp;
dp=NULL;
return res;
}
};
intmain()
{
strings("aabcb");
DistinctSubstring d;
cout<
return0;
}