第四十八题
第一种 二重循环 并用hash判断是否重复 不是题目像要的算法
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
int lengthOfLongestSubstring(string s) {
if(s.size()<=1)
return 1;
// write code here
// 遍历两次二维数组
int len=0;
int temp=1;
map<char,int> start;
for(int i=0;i<s.length();i++)
{
start.clear();
start[s[i]] =1;
temp=1;
for(int j=i+1;j<s.length();j++)
{
if(start [s[j]]!= 1)
{
start[s[j]]=1;
temp++;
}
else
break;
}
len=max(len,temp);
}
return len;
}
};
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
int lengthOfLongestSubstring(string s) {
if(s.size()<=1)
return 1;
// write code here
// 遍历两次二维数组
int len=0;
int temp=1;
map<char,int> start;
for(int i=0;i<s.length();i++)
{
start.clear();
start[s[i]] =1;
temp=1;
for(int j=i+1;j<s.length();j++)
{
if(start [s[j]]!= 1)
{
start[s[j]]=1;
temp++;
}
else
break;
}
len=max(len,temp);
}
return len;
}
};
第二种 利用hash一次遍历
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
int lengthOfLongestSubstring(string s) {
if(s.size()<=1)
return 1;
// write code here
// 不需要二重循环 只需要在hash遇到的时候 修改开始的指针p就好
map<char,int>hash;
// p用来计算没有重复字符串的子串的起始位置
int p=-1;
int len=0;
for(int i=0;i<s.length();i++)
{
// 如果说 出现过这个数字 并且这个数字在这段字符串中间(出现的位置大于p,则p要更新)
if(hash.count(s[i])!=0 && hash[s[i]] > p )
p=hash[s[i]];
// 记录下当前的值,更新长度
hash[s[i]]=i;
len=max(len,i-p);
}
return len;
}
};
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
int lengthOfLongestSubstring(string s) {
if(s.size()<=1)
return 1;
// write code here
// 不需要二重循环 只需要在hash遇到的时候 修改开始的指针p就好
map<char,int>hash;
// p用来计算没有重复字符串的子串的起始位置
int p=-1;
int len=0;
for(int i=0;i<s.length();i++)
{
// 如果说 出现过这个数字 并且这个数字在这段字符串中间(出现的位置大于p,则p要更新)
if(hash.count(s[i])!=0 && hash[s[i]] > p )
p=hash[s[i]];
// 记录下当前的值,更新长度
hash[s[i]]=i;
len=max(len,i-p);
}
return len;
}
};
第三种 对第二种map的优化
map 的复杂度 比直接访问数组大一些,所以创建一个数组用来记录是否有数值即可
使用方法同上
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
int lengthOfLongestSubstring(string s) {
if(s.size()<=1)
return 1;
// write code here
// map的复杂度 比直接访问数组大一些,所以创建一个数组用来记录是否有数值即可
// 后面算法一样 都是让p表示子串的起始位置
vector<int>hash(128,-1);
int p=-1;
int len=0;
for(int i=0;i<s.length();i++)
{
if(hash[s[i]] > p )
{
len=max(len,i-p-1);
p=hash[s[i]];
}
hash[s[i]]=i;
}
// 不用每次都更新 只要在有变化 和最后一次的时候更新就好
len=max(len,int(s.length()-1-p));
return len;
}
};
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
int lengthOfLongestSubstring(string s) {
if(s.size()<=1)
return 1;
// write code here
// map的复杂度 比直接访问数组大一些,所以创建一个数组用来记录是否有数值即可
// 后面算法一样 都是让p表示子串的起始位置
vector<int>hash(128,-1);
int p=-1;
int len=0;
for(int i=0;i<s.length();i++)
{
if(hash[s[i]] > p )
{
len=max(len,i-p-1);
p=hash[s[i]];
}
hash[s[i]]=i;
}
// 不用每次都更新 只要在有变化 和最后一次的时候更新就好
len=max(len,int(s.length()-1-p));
return len;
}
};