给定一个字符串,请你找出其中不含有重复字符的 最长 子串 的长度。
输入: "abcabcbb"
输出: 3
解释: 最长子串是 "abc"
同类:给一个字符串str,找到str中最长的连续子串(不区分大小写),返回其长度。
思考 60秒 。。。
思考 60秒 。。。
class Solution
{
public:
//看到这个题目 输入: "bbbbb" ,我马上想到map 统计每个字符个数,
//这里让统计key 可能是任意字符长度子串 "pwwkew" 该怎么办
//说明key 如果是string 性能可能下降。必须字符作为key。
// 8 ms
//测试: aa->1
int lengthOfLongestSubstring(string s)
{
int result = 0;
vector<int> data(128, -1);
//ASCII码表里字符总共有128个 ASCII码的大小规则:0~9<A~Z<a~z。,用每个字符作为key,永远不可能越界。
//如果重复出现。舍去后面字符重新计算。
int start = 0;
for (int i = 0; i < s.size(); i++)
{
char temp = s[i];
//位置关系 [0 ...start ...i)
if (data[temp] >= start)
{
//如果有重复部分,移动掉前缀重复,重新开始计算。
//移动窗口开始位置。
start = data[temp] + 1;
}
data[temp] = i;
//如果不重复,理想情况,移动窗口结束位置。
result = max(result, i - start + 1);
}
return result;
}
};
/**
* @param s: a string
* @return: an integer
*/
func lengthOfLongestSubstring (s string) int {
// write your code here
var result int =0
var start int =0
hash:=make([]int,128)//默认初始化为0,这里初始化为-1
for i:=0;i<128;i++{
hash[i] =-1
}
for i:=0;i<len(s);i++{
//判断是否重复
end:=s[i]
if(hash[end] >=start) {
start =hash[end]+1
}
hash[end]=i //end-->i
result = max(result,i-start+1)
}
return result
}
func max(i,j int)int{
if i>j{
return i
}else{
return j
}
}
分享最实用的经验 , 希望每一位来访的朋友都能有所收获!