提问
我们有一个这样的字符串abcaffdffqwwwwrcs,最大长度的多少呢?我们发现两个c直接的距离最大,这里最大长度应该是第2个c的位置-第一个c的位置。
算法思路
下面来讲一下算法是实现思路:
先来看看,我们如何求第一个字母a之间的距离,我们先确定a的位置是第一个,我们用一个变量保存a的位置,然后再通过下标移动到底2个a的位置,只需要将第二个位置减去第一个位置即可,这就得到了两个字母之间的距离。
那么问题来了,我们一个字符串有这么的多字符,那么我们如何存放每个字符的位置。这里只需要将每个字符的位置记录在一个数组中,用字符的ascii码作为数组的下标,然后通过这个下标来访问,直接记录或者读取数组记录的位置。
这时候我们每个字符的位置都能记录,但是这个时候,如何求任何两个字符直接的距离,我们需要一个变量来记录最大距离,通过任何两个字符之间的距离与这个变量比较,如果遇到更远的,就记录在这个变量中,直达整个字符串都读取一遍。
算法实现
//C++实现方法
public:
static int lengthOfLongestSubstring(String s){
vector<int> dict(256,-1);
int maxLen = 0,start = -1;
for(int i = 0;i<s.length();i++){
if(dict[s[i]] > -1){
start = dict[s[i]];
maxLen = max(maxLen,i-start)'
}
dict[s[i]] = i;
}
return max;
}
//C语言实现方法
int lengthOfLongestSubstring(const char * str) {
int dict[256];
int i = 0;
for (; i<256; i++) {
dict[i] = -1;
}
int maxLen = 0;
for (i = 0; i < strlen(str); i++) {
if (dict[str[i]]>-1) {
maxLen = max(maxLen, i - dict[str[i]]);
}
dict[str[i]] = i;
}
return maxLen;
}